微信小游戏具有“即开即用“的特性,手游APP则往往需要较长时间的下载。小游戏玩家对于启动时长更为敏感,因此过长的启动时间将导致用户显著流失。
目前普通小游戏普遍启动时间为7~10s,而如果不经优化的Unity WebGL游戏启动会是该时间的2-3倍以上。我们建议开发者将启动优化作为上线前最为重要的事项。
通过修改unity-namespace.js中hideTimeLogModal为false,显示timelog开发者可以看到小游戏目前的启动首屏时长:
要知道各个阶段的含义,我们必要理解启动流程
小游戏启动主要由三部分影响:
- 首包资源下载
- WASM代码下载和编译
- 引擎初始化与开发者首帧逻辑
建议首屏启动时间控制在5~10s甚至更短。
首包资源(webgl/Build目录下的data文件)主要有以下组成:BuildSettings勾选的所有场景、Resources、引擎Builtin资源(Shader、splash等)。可使用AssetStudio查看文件内的所有资源。
当首资源包发生变化时,需要在小游戏的启动阶段就进行下载,因此文件大小极为影响游戏的启动速度。
- 网络条件绝大部分为wifi或4G(另,微信广告可指定网络条件)
- 玩家平均下载速度约2MB/s
- 微信用户存在不少<300KB/s的低网速玩家
- CDN务必针对首资源包开启gzip/br压缩,将极大减少网络传输量
- 中文显示需要自定义字体,打包在首资源包或Bundle;请尽量使用2~3MB以内的精简字体以免影响游戏启动速度
建议: CDN务必针对首资源包开启gzip(可用微信开发者工具的network标签查看响应头确认), gzip后网络传输大小应控制在3~5MB。
WASM分包的大小会直接影响代码下载时长以及程序初始化编译的时间,关于WASM代码对启动速度的影响,开发者需要注意:
- 转换工具会将Unity WebGL包自动进行br压缩(压缩至原code包的20%)
- WASM代码下载与首包资源并行下载,因此占用下载带宽
- WASM编译需要CPU资源,对于低端机来说时间依然可观
我们建议原始代码包(webgl/Build目录下的code文件)不超过30MB, 建议开发者勾选"Strip Engine Code"并设置"Managed Stripping Level"为High。同时,强烈建议开发者可以使用代码分包工具将代码包减少到原始尺寸的到1/3。如果使用Unity2021以上版本,可更改PlayerSettings面板IL2CPP选项为更小尺寸(SIZE)以减少函数量。
在timelog中呈现的首场景耗时即为引擎初始化与开发者首帧逻辑,关于该阶段耗时,开发者需要注意的是:
- MonoBehaviour脚本的首帧Start/Awake应足够少逻辑,优先将画面呈现
- 初始场景不宜过大,通常呈现Splah场景即可
- 初始场景中需要后续主场景或配置加载时可采取分帧策略,切勿在Start/Awake阻塞。
- 对于计算耗时 请使用Android CPU Profiler性能调优分析每一帧的耗时部分。
我们建议开发者使用预下载功能,该功能可以利用此阶段的网络空闲期进行资源下载。
前面我们提到开发者需要将资源从首包分离以较少首屏加载时间,同理,而对于其余的资源开发者最好使用按需加载的方式进行加载,减少玩家进行核心玩法的等待时间。 优化可参考 使用Addressable Assets System或AssetBundle进行资源按需加载。
当分析出小游戏需要进行启动优化时,请继续阅读:
https://github.com/Perfare/AssetStudio
一款开源的资源查看工具,可以检查data首包以及AssetsBundle(或新Addressable)的资源内容,对于分析打包的资源正确性和冗余具有很好的帮助。
https://assetstore.unity.com/packages/tools/utilities/build-report-tool-8162?locale=zh-CN
很好的前端用于查看Unity编译信息,BRT显示了编译时包括的每个资源占用的存储空间以及未使用资源情况。
https://assetstore.unity.com/packages/tools/utilities/asset-hunter-pro-135296
资源清理插件,可将项目中无用资源清理
https://docs.unity3d.com/Packages/[email protected]/manual/index.html Unity全新资源管理流程