性能优化总览
为何需要进行性能优化?
Unity WebGL导出形式相对于原生APP应用,需要开发者更关注性能与体验调优。有以下几点原因:
- 小游戏天生为"即开即用",在小游戏生态下玩家对启动耗时更敏感。
- Unity WebGL底层基于WebAssembly,算力不及原生APP。
- Unity并未对WebGL平台做特别裁剪,启动较慢。
因此,相对于原生APP,无论从启动还是运行上我们都需要做进一步性能优化。
优化措施
1 推荐Unity版本
支持unity 2019及以上,但强烈建议使用unity 2021及以上版本,支持wasm函数缩减及资源纹理ASTC压缩模式。
2 定制启动封面
由于Unity WebGL启动加载需要一定时间,因此需要使用视频或图片等内容作为过渡以留住玩家。
为此平台提供了可定制启动封面方案。
3 加快游戏启动速度
相比常规小游戏,unity游戏包体较大。小游戏启动速度主要影响之一就是包体资源大小,为获得更好的游戏体验,需要对包体资源本身做一些的限制和优化,为此平台也给出的包体限制及优化建议;
对于包体较大的小游戏,平台插件提供了首包资源按需加载 配置选项,开发者需根据自身情况选择合适的首包资资源加载方式;
更多优化手段请阅读:
4 WASM代码下载和编译
WASM的大小会直接影响代码下载时长以及程序初始化编译的时间,关于WASM代码对启动速度的影响,开发者需要注意:
转换工具会将Unity WebGL包自动进行zip压缩(压缩至原code包的22%);
WASM代码下载与首包资源并行下载,因此占用下载带宽;
WASM编译需要CPU资源,对于低端机来说时间依然可观;
建议原始代码包(webgl/Build目录下的code文件)不超过30MB,为此编译时建议按以下要求进行优化:
- 开发者勾选 "Strip Engine Code"并设置"Managed Stripping Level"为High;
- 如果使用Unity2021以上版本,可更改PlayerSettings面板IL2CPP选项为 "Faster (Smaller) Builds" 以减少函数量;
- 同时,强烈建议开发者使用 代码(wasm)分包工具 将代码首包减少到原始尺寸的到1/3。
具体选项勾选参考下图:
5 资源按需加载
区别于原生APP游戏通常安装与启动时将资源都下载完成,小游戏需要做到“即点即玩”,启动仅能加载少量资源,其余部分都必须放CDN进行延迟加载,如何合理与高效地进行资源按需加载是非常重要的事情。
前面我们提到开发者需要将资源从首包分离以较少首屏加载时间,同理,而对于其余的资源开发者最好使用按需加载的方式进行加载,减少玩家进行核心玩法的等待时间,优化可参考Unity的 AA包、AB包方案。
AA/AB 包是常规的分包解决方案,关于他们的选择对于轻度游戏来说两者没有特别要求,倒是功能强大的 AA包 使用门槛更低一些,而对于重度游戏,平台目前所反馈到的结论是使用 AB包 的性能要比 AA包 更好,AA包较大项目时生成的未压缩的 catalog 较大,加载效率低,改用 AB包后,效果提升明显。
更多信息请阅读:
6 资源处理建议
1 贴图maxsize尽量不超过1024,小游戏环境适当降低画质
2 贴图尽量不生成Mipmap
3 贴图尽量不使用可写属性
4 字体文件压缩前最大不超过4MB
更多信息请阅读:
7 优化Unity游戏IndexedDB的适配逻辑
Unity游戏自有的API 如 PlayerPrefs的使用在导出WebGl时,会存储在浏览器的IndexedDB中,在小游戏环境中并无此功能,之前的脚手架版本(cli1.5.2-alpha.0及以下)适配的逻辑过于消耗性能,新版脚手架及C# SDK解决了此适配场景,C# SDK提供了一套PlayerPrefs实现,可无需修改代码进行适配 。