前言
从第一次在知乎听说huatuo(现改名HybridCLR)
已经过去好多个月了,官方宣称特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案
的口号直接吸引了我,单当时还没有应用到线上的项目,也是一直处于观望的态度。前几天再次看到时,PC/android/ios 均已跑通,并有项目正式上线android/ios。且多位业内大佬也是对其大为赞赏并称其为“划时代的热更解决方案”,紧跟大佬脚步,遂决定深入了解学习下怎么用。
目前热更新解决方案
- lua:xLua, toLua, sLua,…(百花齐放)
- CSharp热更:ILRuntime
- il2cpp: HybridCLR
Mono vs IL2CPP
优缺点
c++
运行效率高,速度快- mono编译速度快
c++
跨平台能力强,移植方便c++
是AOT
HybridCLR
特点
近乎完整实现了ECMA-335规范除了 下文中”限制和注意事项” 之外的特性都支持。
零学习和使用成本。 HybridCLR将纯AOT runtime增强为完整的runtime,使得热更新代码与AOT代码无缝工作。脚本类与AOT类在同一个运行时内,可以随意写继承、反射、多线程(volatile、ThreadStatic、Task、async)之类的代码。不需要额外写任何特殊代码、没有代码生成,也没有什么特殊限制。
执行高效。实现了一个极其高效的寄存器解释器,所有指标都大幅优于其他热更新方案。
性能测试报告内存高效。 热更新脚本中定义的类跟普通c#类占用一样的内存空间,远优于其他热更新方案。
内存占用报告原生支持hotfix修复AOT部分代码。几乎不增加任何开发和运行开销。
为什么可以实现热更?
引用下官方的回答:
HybridCLR扩充了il2cpp的代码,使它由纯AOT runtime变成‘AOT+Interpreter’ 混合runtime,进而原生支持动态加载assembly,使得基于il2cpp backend打包的游戏不仅能在Android平台,也能在IOS、Consoles等限制了JIT的平台上高效地以AOT+interpreter混合模式执行。从底层彻底支持了热更新。
通俗的讲就是,加载dll时判断类型,如果是AOT类型就通过IL2CPP AOT
执行,否则通过IL2CPP Interpreter
执行。
为什么是划时代的热更新解决方案?
参考烟雨大神描述