基础知识

名词解释

  1. 域:应用程序的上下文,可以理解为使用热更之后,在游戏中存在两个域,一个是游戏主程序,另一个是热更域。

    跨域继承可以简单理解为跨工程,跨dll继承。比如hotFix.dll继承Assembly-CSharp.dll的一些类。

  2. CLR:Unity脚本(C#)的公共运行库,公共运行环境

    ILRuntime主要是在这里进行热更,使用一些钩子对一些方法进行修改。最后经过CLR进行处理

  3. Assembly-CSharp.dll:Unity脚本(C#)的编译成的dll,非特殊目录下或程序集定义目录下的脚本都放在这个dll下。安卓下可通过反射获取方法和变量。

    在工程文件的Library——ScriptAssemblies目录下可以看到本工程依赖的所有dll库

  4. hotFix.dll: 指热更工程生成的dll,和Unity主工程是两个不同的dll。

    这个dll是属于热更工程,可以认为热更的代码工程和Unity的主工程是不一样的。热更时只更新热更工程

    但是也可以将ILRuntime像Xlua一样注入到Unity主工程中,这里不做介绍

  5. JIT编译:JIT编译器在程序运行时将源代码或字节码编译为机器码,然后执行。与解释执行不同,JIT编译器会在程序运行时编译一部分代码,这些代码可能多次执行或被认为是热点代码。编译后的代码被缓存,以便在后续执行时可以直接运行,而无需再次编译。

  6. 解释执行:解释器在运行程序时,逐行将源代码转换为机器码,然后执行。这意味着程序运行时源代码逐行解释并执行,没有预先编译的过程。

苹果没有禁止解释执行,禁止的是JIT编译。Mono在苹果平台是完全AOT的,以此来实现跨苹果平台。

ILRuntime基本原理

ILRuntime基本原理

上图有一部分是Mono的原理,和IL2CPP不同。

“IL字节码”也称为“中间语言CIL”

可以看到ILRuntime在原本的CLR后贴了一层,它专门用来解释执行热更dll,还可以调用Unity原生dll

ILRuntime热更流程

ILRuntime热更流程

这个图描述的不是很清楚,简单的说把一些底层的不需要热更的代码写在Unity主工程dll库里。游戏的业务逻辑写在热更工程hotfix.dll里。

安卓使用IL2CPP脚本后端的话,也需要通过ILRuntime调用Assembly-CSharp.dll,不能通过反射调用了。

ILRuntime限制

ILRuntime限制

新版的ILRuntime通过寄存器模式,计算指令性能提高了

官网

介绍 — ILRuntime (ourpalm.github.io)

lua做大版本更新时需要将热更的代码转化为C#整合进新包离去,增加了工作量。