什么是热更新?

对于游戏来讲,可以实现在不重新安装游戏的情况下,对游戏中的资源(模型、音效、图片等)、逻辑代码进行替换。

为什么要热更新?

对于用户而言,不用浪费大流量重新下载整个安装包,缩短了获取新版本游戏的时间,不会长时间体验到游戏中的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#相互调用。

热更新原理图(待整理)

游戏热更新 - 图1

参考链接

【Unity游戏客户端框架搭建】五、热更新 https://zhuanlan.zhihu.com/p/93178864

游戏热加载、热补丁原理流程图 https://blog.csdn.net/lengyoumo/article/details/105830819

热更新流程基础原理简介 https://blog.csdn.net/weixin_41995872/article/details/105321229