小游戏启动时间主要包括下载首包文件,引擎初始化,加载首场景三个部分。 通过精简首场景,压缩资源和简化首帧代码逻辑,用户可以大幅减少下载首包文件和加载首场景的时间。 引擎初始化时间则需要通过优化引擎本身来降低, 首包文件大小也能通过引擎的优化降低一部分。
团结引擎在以往的版本中增加了以下优化来帮助减小首包文件:
详细介绍和优化数据可以在相关的页面查看。
团结1.2.0版本中,我们对引擎初始化部分也做了一些优化,主要包括以下内容:
il2cpp在初始化generic方法时,会构建一个存储从generic方法指针到generic方法信息的HashMap,加速后续的generic方法调用和反射查询。 构建generic方法HashMap耗时占用了il2cpp初始化的大部分时间。使用数组代替HashMap,加速generic方法初始化,可以节省将近20% il2cpp初始化时间。
在[Shader内存优化](ShaderMemOpt)的同时,按需加载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采样数量支持情况,因此该步骤可跳过。