深入了解IL2CPP

深入了解IL2CPP

什么是IL2CPP

  • 预先编译(AOT) An ahead-of-time (AOT) compiler
  • 支持虚拟机的运行时库 A runtime library to support the virtual machine

AOT编译器将由 .NET 输出的中间语言(IL)代码生成为C++代码。 运行时库提供服务和抽象,例如垃圾收集器、对线程和文件的独立平台访问以及内部调用的实现(直接修改托管数据结构的本机代码)。

AOT 编译器

IL2CPP AOT 编译器实际的执行文件是 il2cpp.exe.
在Windows平台你可以在Unity安装路径的 Editor\Data\il2cpp 目录中找到它。
在 OSX 上,它位于 Unity安装路径的Contents/Frameworks/il2cpp/build 目录中。
il2cpp.exe 应用程序是一个托管的可执行文件,完全用 C# 编写。在 IL2CPP 的开发过程中使用 .NET 和 Mono 编译器对其进行编译。

il2cpp.exe 应用程序接受使用 Unity 附带的 Mono 编译器编译的托管程序集,将这些程序集转换成C++代码,这些转换出的C++代码最终由部署目标平台上的C++编译器进行编译。

20210817102840

运行时库

IL2CPP 技术的另一部分是对虚拟机提供支持的运行时库。几乎完全使用 C++ 代码实现了这个库(里面还是有一些和平台相关的代码使用了程序集)。运行时库称为 libil2cpp,它是作为一个静态库被链接到最终的游戏可执行文件中。这么做的一个主要的好处是可以使得整个IL2CPP技术是简单并且是可移植的

通过查看 随 Unity 提供的 libil2cpp 的头文件,可以找到有关如何组织 libil2cpp 代码的一些线索( Windows 上头文件在Editor\Data\PlaybackEngines\webglsupport\BuildTools\Libraries\libil2cpp\include 目录中,OSX 上的 Contents/Frameworks/il2cpp/libil2cpp 目录)。例如,由il2cpp产生的C++代码和libil2cpp之间的接口API,存在于codegen/il2cpp-codegen.h这个文件中。

运行时的一个关键部分是垃圾收集器。Unity 5中,我们使用libgc垃圾收集器。它是一个典型的贝姆垃圾收集器(Boehm-Demers-Weiser garbage collector)。(译注:相对使用保守垃圾回收策略)。然而我们的libil2cpp被设计成可以方便使用其他垃圾回收器。因此我们现在也在研究集成微软开源的垃圾回收器(Microsoft GC)。对于垃圾回收器这一点,我们会在后续的一篇中专门的讨论,这里就不多说了。

IL2CPP没做的事情

没有尝试用 IL2CPP 重写 C# 标准库。 当你使用IL2CPP后端构建Unity项目的时候,所有在mscorlib.dll,System.dll等中的C#标准库和原来使用Mono编译时候的一模一样。

我们可以依赖健壮的且久经考验的C#标准库,所以当处理有关IL2CPP的bug的时候,我们可以很肯定的说问题出在AOT编译器或者运行时库这两个地方而不是在其他地方。

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...