导语
该系列将会分为以下几个部分:
1. 总览(本文)
2. c++代码解析
3. 调试c++代码
4. 方法调用(一般方法,虚方法等)
5. 泛型共享
6. 类型与方法的 P/invoke 封装
7. 垃圾回收
8. 测试框架与使用
什么是IL2CPP
IL2CPP 是 Unity 自 4.6.1p5版本 提出的一种新的 scripting backend 方式,为Unity提供了更加高效、更加便携的虚拟机,IL2CPP分为两个独立的部分:
- AOT(静态编译)编译器
- 运行时库
其中AOT编译器将 IL(由.Net编译器输出的中间语言)转换为C++源码,而运行时库则会提供诸如 垃圾回收、线程/文件获取(独立于平台,与平台无关)、内部调用直接修改托管数据结构的原生代码 的服务与抽象。
AOT编译器
所谓AOT编辑器即 il2cpp.exe
在 Windows 系统中你可以在 Editor\Data\il2cpp 目录中找到它,
在 OSX 系统中你可以在 Contents/Frameworks/il2cpp/build,即Unity的安装目录中找到它。
il2cpp.exe 是由C#编写的受托管的可执行程序,它接受我们在Unity中通过Mono编译器生成的托管程序集,并生成指定平台下的C++代码。
IL2CPP的工具链如下图所示:
il2cpp-toolchain
运行时库
IL2CPP技术的另一部分是运行时库(libil2cpp),它的存在是为了支持IL2CPP虚拟机的运行,运行时库几乎完全由C++代码编写,并作为一个静态库与最终的可执行程序链接。(值得一提的是,IL2CPP技术十分得益于使用了libil2cpp这一更轻便的运行时库)
你可以通过查看 libil2cpp 的头文件了解其的代码构成(Windows 系统下的目录为Editor\Data\PlaybackEngines\webglsupport\BuildTools\Libraries\libil2cpp\include,OSX 系统下的目录为 Contents/Frameworks/il2cpp/libil2cpp),例如你可以在 codegen/il2cpp-codegen.h 文件中看到 il2cpp.exe 生成C++代码的接口以及 运行时库 的接口。
运行时库的另一关键功能是提供了垃圾回收,这一块内容将在后续的文章里再详细探讨。
AOT编译器是如何运行的
让我们来看一个例子(该例子运行在 Windows 系统下 Unity 5.0.1版本中)
开启一个新的工程,将如下脚本添加至主相机上:
-
using UnityEngine;