热更新知识点汇总
热更新的概念
游戏或者软件更新时,无需重新下载客户端进行安装,而是在应用程序启动的情况下,
在内部进行的资源或者代码更新。
热更新的优点
- 迅速修复Bug – 避免重新下载安装包,游戏内部及时更新Bug
- 减小安装包的体积 – 非核心资源上传服务器,运行时动态加载剩余资源
- 迅速更换游戏"内核" – 狸猫换太子,绕过审核,迅速对游戏进行更新
热更新解决方案
-
基于Lua的热更新解决方案
-
基于C#的热更新解决方案
- 原理:本质上用编译好的新DLL替换需要更新的旧DLL。只能进行代码热更新,还需配合AB包的资源热更新一起使用。
- 优点:
- 和Unity开发均使用C#,开发语言统一,编码更容易。
- 使用纯C#开发无需另创虚拟机等环境,效率高,性能远高于Lua
- 缺点:
- 方案均有各自的局限性,直接反射方式不仅损耗性能,在不支持JIT的系统(IOS)上无法使用。
ILRuntime 解决了JIT的问题但不够成熟,使用问题较多,需要较高的动手解决问题能力。 - 解决方案
- DLL反射热更新: 使用编译后的DLL文件进行替换,利用反射方式把所需C#组件绑定到相应的对象上使用。
ILRuntime :本质还是DLL的替换,但实现了一个ILR(IL运行时)使其能够在不支持JIT的硬件环境(IOS)下实现代码热更新。
热更新基本流程
- 版本号的比较,如果版本号不同才继续以下流程(version.txt记录版本号,可选)
- 下载资源服务器上的对比文件(files.txt记录所有文件md5码,类似于目录)
- 确定下载列表,将最新下载的对比文件和本地旧对比文件对比,记录缺少或不同的文件。(利用files.txt中的md5码实现此步骤)
- 根据下载列表,下载所需的资源。(一般放在
Application.persistentDataPath ) - 解压(如果文件压缩过需要先解压,可选)
- 保证下载成功后,用最新的对比文件覆盖本地的对比文件(更新目录)
热更新规则
-
资源打包方式:需要更新的代码和资源,都必须打包成AssetBundle (AB包)进行下载和加载,AB包的特性适合做热更新。(理由如下)
- AB包存储位置自定义,继而可放入可读可写的路径下便于实现热更新
- AB包自定义压缩方式,可以选择不压缩或选择LZMA和LZ4等压缩方式,减小包的大小,更快的进行网络传输。
- 资源可分布在不同的AB包中,最大程度减少运行时的内存压力, 可做到即用即加载,有选择的加载需要的内容。
- AB包支持后期进行动态更新,显著减小初始安装包的大小,非核心资源以AB包形式上传服务器,后期运行时动态加载,提高用户体验。
-
资源存放路径:优先选择将需要进行更新的代码和资源放在Application.persistentDataPath ,相较其它特殊目录,该目录下可读可写,运行时有效且无内容限制更适合做热更新开发。(几个重要路径的对比如下)
|