什么是热更新?
对于游戏来讲,可以实现在不重新安装游戏的情况下,对游戏中的资源(模型、音效、图片等)、逻辑代码进行替换。
为什么要热更新?
对于用户而言,不用浪费大流量重新下载整个安装包,缩短了获取新版本游戏的时间,不会长时间体验到游戏中的bug,提高了游戏体验等。
对于开发人员而言:热调试,热开发,热发布能够提升开发效率,缩短开发周期。游戏已经上线运行,当出现Bug、或者修改、增加某个功能时,不需要玩家重新到应用商下载安装安装包,就可以更新游戏内容。
什么样的代码执行能支持热更新?
代码运行主要分为两种模式:
将所有的代码加载到内存 -> 运行
将核心代码先加载到内存 -> 运行 -> 按需动态加载其他代码,动态执行
热更新也是有范围的,核心代码是无法被热更新的,只能重新下载新的程序重新安装,只有动态加载的逻辑代码能够被更新替换。
热更新原理
Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新。
Unity提供可以热更的方案就是AssetsBundle(后面简称AB)。资源、代码都可以打成AB包,放到服务器上,然后比对版本,进行热更。
Unity3D的热更新会涉及3个目录:游戏资源目录、数据目录、网络资源地址。
不同平台的热更新方式
Android、PC平台
- 将执行代码预编译为AssemblyDLL
- 将代码作为TextAsset打包进AssetBundle
- 运行时调用AssemblyDLL代码
- 更新相应的AssetBundle即可实现热更新
IOS
苹果官方禁止ios中的程序热更新;JIT在IOS下无效。使用Unity + Lua插件
常见热更新插件
目前比较流行的热更新插件:uLua、toLua、xLua。Lua语言特性:跨平台运行、无需编译 以及这些插件实现了与C#的交互。
sLua:代码质量好,性能比toLua低
- toLua:其热更新主要是依托于LuaFramework框架的
- uLua:是由luainterface/cs2lua/tolua演变而来的,由于作者不再维护,推荐我们使用tolua
- C#的Light技术:C#Light是一个简单的嵌入式脚本,模仿c#的语法风格,完全由pure c#写成
- xLua:为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。
热更新原理图(待整理)
参考链接
【Unity游戏客户端框架搭建】五、热更新 https://zhuanlan.zhihu.com/p/93178864
游戏热加载、热补丁原理流程图 https://blog.csdn.net/lengyoumo/article/details/105830819
热更新流程基础原理简介 https://blog.csdn.net/weixin_41995872/article/details/105321229