ILRuntime介绍
基础知识
名词解释
域:应用程序的上下文,可以理解为使用热更之后,在游戏中存在两个域,一个是游戏主程序,另一个是热更域。
跨域继承可以简单理解为跨工程,跨dll继承。比如hotFix.dll继承Assembly-CSharp.dll的一些类。
CLR:Unity脚本(C#)的公共运行库,公共运行环境
ILRuntime主要是在这里进行热更,使用一些钩子对一些方法进行修改。最后经过CLR进行处理
Assembly-CSharp.dll:Unity脚本(C#)的编译成的dll,非特殊目录下或程序集定义目录下的脚本都放在这个dll下。安卓下可通过反射获取方法和变量。
在工程文件的Library——ScriptAssemblies目录下可以看到本工程依赖的所有dll库
hotFix.dll: 指热更工程生成的dll,和Unity主工程是两个不同的dll。
这个dll是属于热更工程,可以认为热更的代码工程和Unity的主工程是不一样的。热更时只更新热更工程
但是也可以将ILRuntime像Xlua一样注入到Unity主工程中,这里不做介绍
JIT编译:JIT编译器在程序运行时将源代码或字节码编译为机器码,然后执行。与解释执行不同,JIT编译器会在程序运行时编译一部分代码,这些代码可能多次执行或被认为是热点代码。编译后的代码被缓存,以便在后续执行时可以直接运行,而无需再次编译。
解释执行:解释器在运行程序时,逐行将源代码转换为机器码,然后执行。这意味着程序运行时源代码逐行解释并执行,没有预先编译的过程。
苹果没有禁止解释执行,禁止的是JIT编译。Mono在苹果平台是完全AOT的,以此来实现跨苹果平台。
ILRuntime基本原理
上图有一部分是Mono的原理,和IL2CPP不同。
“IL字节码”也称为“中间语言CIL”
可以看到ILRuntime在原本的CLR后贴了一层,它专门用来解释执行热更dll,还可以调用Unity原生dll
ILRuntime热更流程
这个图描述的不是很清楚,简单的说把一些底层的不需要热更的代码写在Unity主工程dll库里。游戏的业务逻辑写在热更工程hotfix.dll里。
安卓使用IL2CPP脚本后端的话,也需要通过ILRuntime调用Assembly-CSharp.dll,不能通过反射调用了。
ILRuntime限制
新版的ILRuntime通过寄存器模式,计算指令性能提高了
官网
介绍 — ILRuntime (ourpalm.github.io)
lua做大版本更新时需要将热更的代码转化为C#整合进新包离去,增加了工作量。