第一篇技术博客,主要是为了自己的记忆理解,希望也能给看到的小伙伴解答一些疑惑。
立个flag,每次学到或者自己领会到新的知识点的时候,尽可能写成一篇博客,方便未来回顾改进,也作为一个分享技术的方法。
博主目前还只是个小菜鸡~~
分割线
首先要先简要描述下热更新是什么东西。
热更的概念是游戏或者软件需要更新时,无需重新下载一个新的客户端,而是在运行的情况下,在内部更新下载资源和代码文件实现更新。
热更的好处显而易见,可以极大程度方便用户进行游戏软件的更新,另外同时使得开发者可以迅速地修改游戏bug,另外减少安装包的大小,所需要的资源可以在运行时另外动态加载。
ToLua
Tolua作为一个常用的热更新框架 ,本质上是提供一个在Unity中可以运行lua的虚拟机,使得lua和c#可以互相调用和访问。
让我们先回到一个简单的问题,为什么要用lua进行热更新?首先lua作为一个解释语言,不需要事先编译成块,而是运行时解释执行,这契合热更特点,另外lua通用性强,并且有大量成熟的项目经验。
- 基本原理:通过静态绑定的方式来实现C#和lua之间的交互
- TODO 后续附上详细代码实现和具体细节
热更新基本流程
- 版本号的比较,如果版本号不同才继续以下流程(version.txt记录版本号,可选)
- 下载资源服务器上的对比文件(files.txt记录所有文件md5码,类似于目录)
- 确定下载列表,将最新下载的对比文件和本地旧对比文件对比,记录缺少或不同的文件。(利用files.txt中的md5码实现此步骤)
- 根据下载列表,下载所需的资源。(一般放在Application.persistentDataPath)
- 解压(如果文件压缩过需要先解压,可选)
- 保证下载成功后,用最新的对比文件覆盖本地的对比文件(更新目录)
热更新规则
资源打包方式:需要更新的代码和资源,都必须打包成AssetBundle(AB包)进行下载和加载,AB包的特性适合做热更新。(理由如下)
- AB包存储位置自定义,继而可放入可读可写的路径下便于实现热更新
- AB包自定义压缩方式,可以选择不压缩或选择LZMA和LZ4等压缩方式,减小包的大小,更快的进行网络传输。
- 资源可分布在不同的AB包中,最大程度减少运行时的内存压力, 可做到即用即加载,有选择的加载需要的内容。
- AB包支持后期进行动态更新,显著减小初始安装包的大小,非核心资源以AB包形式上传服务器,后期运行时动态加载,提高用户体验。
资源存放路径:优先选择将需要进行更新的代码和资源放在Application.persistentDataPath,相较其它特殊目录,该目录下可读可写,运行时有效且无内容限制更适合做热更新开发。
参考文章:https://blog.csdn.net/Q540670228/article/details/122713401