il2cpp为了避免泛型代码膨胀,节约内存,在保证代码逻辑正确性的情况下对于一些能够共享代码,只生成一份代码。为此引入一个概念叫泛型代码共享Generic Sharing。 简单来说,你只要在AOT中实例化过某个泛型类或泛型函数的共享实例,你就可以在热更新代码中使用它了。
由于IL2CPP AOT模块的存在,IL2CPP比标准运行时多了一些不存在的机制,因此HybridCLR也有一些额外的特性: 支持使用Interpreter Assembly替换AOT Assembly(限制:必须不存在其他AOT Assembly对它的直接引用)。 支持补充元数据机制,彻底支持AOT泛型,参见《AOT泛型限制及原理介绍》。 支持AOT Hotfix,可以修复AOT模块的Bug。 支...
因为值类型无法泛型共享,而热更新值类型不可能提前在AOT里泛型实例化。这个限制由下一节基于补充元数据的泛型函数实例化技术彻底解决。不过即使没有这个限制,对于AOT值类型,能提前泛型实例化,可以大幅提升性能(毕竟不用解释执行了)。后续会有工具帮助自动收集热更新模块中的泛型实例,尽量让它提前AOT实例化。 il2cpp中...
HybridCLR是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更新解决方案。 HybridCLR扩充了il2cpp运行时代码,使它由纯AOTruntime变成AOT+Interpreter 混合runtime,进而原生支持动态加载assembly,从底层彻底支持了热更新。使用HybridCLR技术的游戏不仅能在Android平台,也能在IOS、Consoles、WebGL等所...
interr=HybridCLR.RuntimeApi.LoadMetadataForAOTAssembly(dllBytes,HomologousImageMode.SuperSet); Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. ret:{err}"); } } } 现在你可以在热更新代码随意使用AOT泛型了。 提示 请保存打包时生成的裁剪后的AOT dll(一般在{project}/HybridCLRData/AssembliesPostIl...
基于IL2CPP的拓展,将IL2CPP的AOT变成AOT+Interpreter模式,从而支持动态加载Assembly,实现C#层面的热更新。其实现热更新的本质是内置了一个解释器。 “AOT是Ahead Of Time的缩写,意思是预先编译,这里指的是预先编译DLL” 实现内容 实现了一个(高效)dll解析库 ...
HybridCLR HybridCLR热更底层逻辑是对Unity IL2CPP运行机制的扩展,打破IL2CPP AOT的限制或缺陷;核心思想是修改IL2CPP的运行时,使得Unity在AOT编译后的代码基础上仍然可以通过JIT的方式加载和执行IL代码,相当于是将原本IL2CCP运行机制(AOT Runtime)扩展为脚本混合更新(AOT+JIT Runtime)。
IL2CPP 这个项目而言 :采用的AOT技术 JIT技术:Just In Time 运行时编译成二进制机器指令 IL2CPP vm:IL2CPP的虚拟机,更像一个库,提供一些服务;(gc垃圾回收、IL2CPP编写一些库来提供服务) 运行时的时候:Unity == IL2CPP技术编译出来的二进制指令 + IL2CPP runtime的环境(GC,Thread等技术支撑) ...
HybridCLR是原生的c#热更新方案。通俗地说,il2cpp相当于mono的aot模块,HybridCLR相当于mono的interpreter模块,两者合一成为完整mono。HybridCLR使得il2cpp变成一个全功能的runtime,原生(即通过System.Reflection.Assembly.Load)支持动态加载dll,从而支持ios平台的热更新。
HybridCLR的热更原理是基于对IL2CPP运行时的扩展,将其由纯AOT Runtime改造为“AOT+Interpreter”双引擎的混合运行时。这种混合运行时可以完美支持在iOS这种禁止JIT的平台上以解释模式无缝地运行动态加载的DLL。 具体来说,HybridCLR的实现至少需要完成以下功能: 1.加载和解析DLL元数据:这是动态加载DLL的基础。 2.动态...