IL2CPP 运行时,作为 Unity 脚本代码的虚拟机,负责执行游戏逻辑并在后台管理内存。然而,它在执行过程中也会消耗一定的内存资源,主要用于存储脚本运行时的元数据,以提高执行效率。脚本元数据大小和工程的代码量是正相关的,一个直观反映就是 global-metadata.dat
文件的大小。
以一个 14MB 大小的 global-metadata.dat
文件为例,IL2CPP 运行时在游戏运行期间可能占用高达 64MB 的内存。通过优化,我们可以将内存占用减少到 33MB 。
在之前的实现中,IL2CPP 在使用到某个类型时,会初始化这个类型完整的元数据,包括它的所有函数、接口、事件、属性、虚函数表等,并且一旦加载后就不会再释放。
通过深入分析,脚本代码实际运行时,通常只会用到很少的一部分元数据(反射、或者虚函数调用时访问)。 例如,一个数组类型可能包含155个方法和25个虚函数,实现了6个接口,但实际运行时可能只会用到其中一小部分,导致大量内存被冗余加载。
因此,可以采用延迟加载策略。这意味着只有当游戏真正需要某个元数据项时,才会初始化和加载该数据。这种方法可以显著减少 IL2CPP 运行时的内存占用。