# 提升Unity WebGL游戏启动速度
# 为什么要做启动优化
玩家在下载时只能被动等待,对于启动时长很敏感,过长的启动时间将导致用户显著流失。 不经优化的Unity WebGL游戏首次冷启动时间会20s以上。建议开发者将启动优化作为上线前最重要的事项。优化到10s内。
# 优化的目标与标准
参考小游戏性能标准中unity游戏的冷启动耗时
# 分析小游戏启动速度
# 启动流程
拉起Unity WebGL小游戏流程
小游戏启动主要由三部分影响:
- 首包资源下载
- WASM代码下载和编译
- 引擎初始化与开发者首帧逻辑
建议首屏启动时间控制在5~10s甚至更短。
# 分阶段耗时
# 首资源包下载与体积
# 资源部分
unity游戏首包资源(导出目录中webgl/Build目录下的webgl.data文件)在游戏首次下载或更新首资源包时,需要在小游戏的启动前期下载,因此文件大小极为影响游戏的启动速度。 data文件主要包含了选择要build的scene引用的资源和所有resource目录下的资源,,可以在打包后查看editor log中的build report,看到哪些资源被打包进了data文件,并分析哪些体积大的资源可以移出data文件。
主要组成及对应优化建议如下:
- unity default resources文件,引擎默认资源,如Arial字体,默认mesh,纹理等
- il2cppmetadata, C#代码使用il2Cpp生成cpp代码时,生成的类,方法等信息
- unity builtin_extra, always include的shader
- BuildSettings中所有active的场景。选择一个简单的场景如loading scene或者menu scene进行打包,如果没有的话,可以创建一个loading scene。
- resources文件夹中的资源,以及其中的资源引用到的其他资源。 所有名为resource的目录都会被打包,不管位于什么层级结构。因此需要关注每个resource目录,如果可能的话,将resource资源移动或者修改resource目录的名字。
- 全局设置及引用到的资源,如splash图片等。如果不是加载后立即可见的资源,都可以拆分成bundle,在首包后加载。
- 网络条件绝大部分为wifi或4G
- 玩家平均下载速度约2MB/s
- 用户存在不少<300KB/s的低网速玩家
- 中文显示需要自定义字体,打包在首资源包或Bundle。请尽量使用2~3MB以内的精简字体以免影响游戏启动速度
建议:压缩后的.data大小应控制在3~5MB。可在导出文件夹 webgl 目录下查看中data文件brotli压缩后的的大小
# 其他配置
- Unity小游戏配置文件
- StreamingAssets中部分文件
# 首WASM代码下载和编译
WASM分包的大小会直接影响代码下载时长以及程序初始化编译的时间,关于WASM代码对启动速度的影响,开发者需要注意:
- 导出工具会将Unity WebGL包自动进行br压缩(压缩至原code包的20%),具体压缩后大小可在导出文件夹webgl目录下查看xxxx.unityweb.wasm.br文件大小
- WASM代码下载与首包资源并行下载,因此占用下载带宽
- WASM编译需要CPU资源,对于低端机来说时间依然可观
# WASM代码优化建议
- 生成的原始代码不超过50MB(webgl/Build/webgl.wasm文件),br压缩后不超过10M(webgl/xxxx.unityweb.wasm.br文件)
- 勾选Strip Engine Code并设置Managed Stripping Level为High
- 开启Wasm代码分包功能,减少wasm首包大小(减少到约1/3),会大大降低编译时间
- 如果使用Unity2021以上版本,可更改PlayerSettings面板IL2CPP选项为更小尺寸(SIZE)以减少函数量。
# 缩小WASM代码包方法
- 移除无用的package
打开package manager,首先查看In Project,如果有确定没有用到的package,如In-App Purchase、Unity Analysis等,可以直接移除。注意Editor下的插件不会被打包,所以无需删除。 查看package manager的built-in分类,如果确认项目没有使用到的unity功能模块,可以disable。但注意这部分如果想要打包时不包含,需要开启strip engine code。开启strip engine code时需要打包出来测试下各功能是否有异常,如果有缺少class的报错,需要把对应的class添加到link.xml中。
- 删除无用代码
开发过程中,如果看到大量引用为0的代码,可以将其删除,一定程度上可以减少wasm大小。尤其是一些没有用到的插件,虽然没有引用,但代码仍然会被打包,因此如果能够确信没有用到,可以把代码删除。 删除无用代码时,需要特别注意是否有宏定义,尤其是!UNITY_EDITOR这类宏,在editor下会显示没有引用到,但runtime下可能存在引用。
- 使用Wasm Analysis工具
团结引擎提供了wasm analysis工具,可以利用该工具分析wasm构成,具体使用方法参见Wasm Analysis工具 (opens new window) 可以找指令数量排名靠前的类或者包,看是否可以对类进行删减或者移除对包的引用。但想有较大程度的减少难度确实较大,如果不能很快找到可删减内容,建议不用花太多时间。
# 引擎初始化与开发者首帧逻辑
游戏启动阶段耗弹窗显示时即为引擎初始化与开发者首帧逻辑,关于该阶段耗时,开发者需要注意的是:
- MonoBehaviour脚本的首帧Start/Awake应足够少逻辑,优先将画面呈现
- 初始场景不宜过大,通常呈现Splash场景即可
- 初始场景中需要后续主场景或配置加载时可采取分帧策略,切勿在Start/Awake阻塞
# 游戏内资源按需加载
前面我们提到开发者需要将资源从首包分离以较少首屏加载时间,同理,而对于其余的资源开发者推荐使用按需加载的方式进行加载,减少玩家进行核心玩法的等待时间。 优化可参考使用Addressable或AssetBundle进行资源按需加载。
# 常用启动优化工具
AssetStudio(推荐)
https://github.com/Perfare/AssetStudio (opens new window)
一款开源的资源查看工具,可以检查data首包以及AssetsBundle(或新Addressable)的资源内容,对于分析打包的资源正确性和冗余具有很好的帮助。
BuildReportTool(推荐)
https://assetstore.unity.com/packages/tools/utilities/build-report-tool-8162?locale=zh-CN (opens new window)
很好的前端用于查看Unity编译信息,BRT显示了编译时包括的每个资源占用的存储空间以及未使用资源情况。
Asset Hunter
https://assetstore.unity.com/packages/tools/utilities/asset-hunter-pro-135296 (opens new window)
资源清理插件,可将项目中无用资源清理
Unity Addressable Assets System
https://docs.unity3d.com/Packages/com.unity.addressables@1.16/manual/index.html (opens new window) Unity全新资源管理流程