纹理压缩格式调整:将默认纹理的压缩格式从 rgba
改为 astc
,以减少文件大小。
移除不支持的 Compute Shader:移除了小游戏平台不支持的 Compute Shader,进一步降低了首包资源的体积。
对默认资源使用没有影响。
il2cpp 运行时依赖元数据来获知 C# 类型、方法等信息。元数据的大小与小游戏中的 C# 代码数量正相关,其中保存了程序集,类型,方法等信息和相互之间的引用关系。虽然默认的元数据结构可以支持超过21亿个类型或方法,但对于小游戏来说,方法的数量通常在万这个级别。
因此在打包小游戏时,我们会获取当前使用到的方法数量,根据数量的大小自动选择满足当前要求的精简后的元数据结构,从而达到减小 il2cpp 元数据文件的目的。
由于 il2cpp 元数据文件保存在游戏的首包内,并且在小游戏运行时常驻内存中,因此 il2cpp 元数据精简对小游戏的启动时间,内存都有所帮助。在某案例中,global-metadata.dat 从 15.3MB 缩减为 13.3MB,缩减了约 15% 左右。
在团结引擎1.2.0版本中,对引擎初始化进行了以下优化:
il2cpp 在初始化 generic 方法时,会构建一个存储从 generic 方法指针到 generic 方法信息的 HashMap,加速后续的 generic 方法调用和反射查询。
构建 generic 方法 HashMap 耗时占用了 il2cpp 初始化的大部分时间。使用数组代替 HashMap,加速 generic 方法初始化,可以节省将近20% il2cpp 初始化时间。
在 Shader 内存优化的同时,按需加载 Shader 变体。游戏启动时仅需加载 Shader 数据表头,后续实际使用到特定 Shader 变体时再从 shader blob 中加载变体数据。
延迟创建 MonoScript 缓存,从而减少 MonoManager 初始化时间。
MonoScript 是 MonoBehavioure 脚本对应的可序列化资源。引擎在启动加载 MonoManager 时, 会反序列化所有的 MonoScript ,并创建 MonoScript 缓存。 缓存的信息包括 MonoScript 在当前 VM(il2cpp/mono)中的类型句柄,引擎回调函数(Awake,Update等)句柄等。
将创建 MonoScript 缓存这一步改为懒加载模式,可以节省一部分 MonoManager 初始化时间。
使用 WebGL2.0 时,引擎初始化 GLES Gfx Device 会额外遍历所有支持的纹理格式,查询每个纹理格式所支持的 MSAA 采样数量。 而小游戏平台上几乎不会开启 MSAA,更没有必要精细到每个纹理格式的 MSAA 采样数量支持情况,因此该步骤可跳过,从而加速小游戏的启动过程。