Version: 1.5
语言 : 中文
首包数据文件精简
资产流式加载

团结引擎启动优化

引擎资源优化

宿主字体支持

  • 给小游戏平台方提供运行时加载字体文件的方案,从而允许用户直接使用宿主提供的中文字体,减少了游戏包中字体资源的体积。

默认资源文件优化

  • tuanjie_default_resources 文件的大小从 593KB 减少至 341KB,从而使小游戏的首包数据文件减少了 252KB。
  • 这一优化对启动时间和内存占用都有显著的改善。

实现细节

  • 纹理压缩格式调整:将默认纹理的压缩格式从 rgba 改为 astc,以减少文件大小。

  • 移除不支持的 Compute Shader:移除了小游戏平台不支持的 Compute Shader,进一步降低了首包资源的体积。

对默认资源使用没有影响。

il2cpp 元数据精简

il2cpp 运行时依赖元数据来获知 C# 类型、方法等信息。元数据的大小与小游戏中的 C# 代码数量正相关,其中保存了程序集,类型,方法等信息和相互之间的引用关系。虽然默认的元数据结构可以支持超过21亿个类型或方法,但对于小游戏来说,方法的数量通常在万这个级别。

因此在打包小游戏时,我们会获取当前使用到的方法数量,根据数量的大小自动选择满足当前要求的精简后的元数据结构,从而达到减小 il2cpp 元数据文件的目的。

由于 il2cpp 元数据文件保存在游戏的首包内,并且在小游戏运行时常驻内存中,因此 il2cpp 元数据精简对小游戏的启动时间,内存都有所帮助。在某案例中,global-metadata.dat 从 15.3MB 缩减为 13.3MB,缩减了约 15% 左右。

  • il2cpp 元数据精简特性可以通过 Edit -> Project Settings -> Use Slim Format For global-metadata.dat 选项来控制开启,默认为勾选状态。
il2cpp元数据精简
il2cpp元数据精简

引擎初始化加速

在团结引擎1.2.0版本中,对引擎初始化进行了以下优化:

il2cpp 初始化加速

il2cpp 在初始化 generic 方法时,会构建一个存储从 generic 方法指针到 generic 方法信息的 HashMap,加速后续的 generic 方法调用和反射查询。

构建 generic 方法 HashMap 耗时占用了 il2cpp 初始化的大部分时间。使用数组代替 HashMap,加速 generic 方法初始化,可以节省将近20% il2cpp 初始化时间。

优化前 优化后

Shader 变体延迟加载

Shader 内存优化的同时,按需加载 Shader 变体。游戏启动时仅需加载 Shader 数据表头,后续实际使用到特定 Shader 变体时再从 shader blob 中加载变体数据。

优化前 优化后

延迟创建 MonoScript 缓存

延迟创建 MonoScript 缓存,从而减少 MonoManager 初始化时间。

MonoScript 是 MonoBehavioure 脚本对应的可序列化资源。引擎在启动加载 MonoManager 时, 会反序列化所有的 MonoScript ,并创建 MonoScript 缓存。 缓存的信息包括 MonoScript 在当前 VM(il2cpp/mono)中的类型句柄,引擎回调函数(Awake,Update等)句柄等。

将创建 MonoScript 缓存这一步改为懒加载模式,可以节省一部分 MonoManager 初始化时间。

优化前 优化后

GLES Gfx Device 初始化优化

使用 WebGL2.0 时,引擎初始化 GLES Gfx Device 会额外遍历所有支持的纹理格式,查询每个纹理格式所支持的 MSAA 采样数量。 而小游戏平台上几乎不会开启 MSAA,更没有必要精细到每个纹理格式的 MSAA 采样数量支持情况,因此该步骤可跳过,从而加速小游戏的启动过程。

优化前 优化后

首包数据文件精简
资产流式加载