X

Unity CSharp 热更新

所谓热更新是指一个应用在不修改已发布的母包(.apk .ipa)的情况下修改其内容。当然调整美术资源和代码逻辑都属于热更新,只要母包本身没有被修改。这里只是比较用于Unity游戏中热更新CSharp代码的两种方案的异同。

ILRuntime

https://github.com/Ourpalm/ILRuntime

ILRuntime是掌趣开源的CSharp热更新方案,我上一个项目就使用了该方案,使用比较友好,开发也相对较快,当然也有一些问题。

原理: 类似tolua,将热更新代码编译为dll,在运行时通过虚拟机来解释执行热更代码。

优点:

  • 开发效率高
  • 自由增加热更模块
  • 使用C#编写热更代码

缺点:

  • 代码运行效率低(UI等逻辑对效率不敏感,不用关心)
  • 更多的GC

InjectFix

https://github.com/Tencent/InjectFix

InjectFix是腾讯开源的类似XLua的热更新方案,该方案放弃了Lua更新,改由纯CSharp的更新方案,使得拥有了静态语言的优点。

原理: 通过对现有工程里的任意方法插桩,在运行时再执行热更的方法来实现热更代码。

优点:

  • 开发效率高
  • 运行效率高
  • 直接在Unity工程中写代码(电脑性能不好,每次编译时间会有几秒钟)

缺点:

  • 不支持新增类型
  • 不支持新增方法
  • 不支持新增值类型的泛型方法 (值类型的泛型方法的需要编译为不同的函数)
  • 维护成本高,容易在热更时误操作到以上不支持的项

总结

对于小型游戏,允许经常更新母包的游戏建议使用InjectFix

严重依赖热更的项目,上线后还要热更新模块而非简单的修修小Bug,建议使用ILRuntime

This post was last modified on 2019 年 12 月 05 日 23:47

This website uses cookies.