#  提升游戏启动速度

## 一、 为什么要做启动优化
### 1.1  小游戏与手游APP的启动差异
微信小游戏具有“即开即用“的特性，手游APP则往往需要较长时间的下载。小游戏玩家对于启动时长更为敏感，因此过长的启动时间将导致用户显著流失。

### 1.2 优化的目标与标准
目前普通小游戏普遍启动时间为7~10s，而如果不经优化的Unity WebGL游戏启动会是该时间的2-3倍以上。我们建议开发者将启动优化作为上线前最为重要的事项。

## 二、分析小游戏启动速度

### 2.1. 查看启动耗时

通过修改unity-namespace.js中hideTimeLogModal为false，显示timelog开发者可以看到小游戏目前的启动首屏时长：

![](https://res8.wxqcloud.qq.com.cn/wxdoc/587bafb3-8970-4749-b3b5-4ff10fa8cd32.png)

要知道各个阶段的含义，我们必要理解[启动流程](Startup)

小游戏启动主要由三部分影响：
> 1. 首包资源下载 
> 2. WASM代码下载和编译 
> 3. 引擎初始化与开发者首帧逻辑

**建议首屏启动时间控制在5~10s甚至更短**。

### 2.2 分阶段耗时
### 2.2.1 首资源包下载与体积
首包资源(webgl/Build目录下的data文件)主要有以下组成：
- unity default resources文件，引擎默认资源，如Arial字体，默认mesh，纹理等
- il2cppmetadata， C#代码使用il2Cpp生成cpp代码时，生成的类，方法等信息
- unity builtin_extra, always include的shader
- BuildSettings中所有active的场景
- Resources文件夹中的资源，以及其中的资源引用到的其他资源
- 全局设置及引用到的资源，如splash图片等

可使用[AssetStudio](https://github.com/Perfare/AssetStudio)查看文件内的所有资源。

首次下载或更新首资源包时，需要在小游戏的启动前期下载，因此文件大小极为影响游戏的启动速度。
> 1. 网络条件绝大部分为wifi或4G(另，微信广告可指定网络条件)
> 2. 玩家平均下载速度约2MB/s
> 3. 微信用户存在不少 4. 务必对首资源包压缩： 转换面板勾选“压缩首资源包” 或 CDN管理后端针对首资源包(后缀.txt)“开启gzip/br压缩“
> 5. 中文显示需要自定义字体，打包在首资源包或Bundle；***请尽量使用2~3MB以内的精简字体以免影响游戏启动速度***

建议： 务必对首资源包进行压缩传输，使用微信开发者工具的network标签确认传输量，网络传输大小应控制在**3~5MB**。

### 2.2.2 WASM代码下载和编译
WASM分包的大小会直接影响代码下载时长以及程序初始化编译的时间，关于WASM代码对启动速度的影响，开发者需要注意：
>1. 转换工具会将Unity WebGL包自动进行br压缩(压缩至原code包的20%)
>2. WASM代码下载与首包资源并行下载，因此占用下载带宽
>3. WASM编译需要CPU资源，对于低端机来说时间依然可观

我们建议原始代码包(webgl/Build目录下的code文件)**不超过30MB**, 建议开发者**勾选"Strip Engine Code"并设置"Managed Stripping Level"为High**。同时，强烈建议开发者可以使用[代码分包](WasmSplit)工具将代码包减少到原始尺寸的到1/3。如果使用Unity2021以上版本，可更改PlayerSettings面板IL2CPP选项为更小尺寸(SIZE)以减少函数量。

### 2.2.3 引擎初始化与开发者首帧逻辑
在timelog中呈现的首场景耗时即为引擎初始化与开发者首帧逻辑，关于该阶段耗时，开发者需要注意的是：
>1. MonoBehaviour脚本的首帧Start/Awake应足够少逻辑，优先将画面呈现
>2. 初始场景不宜过大，通常呈现Splah场景即可
>3. 初始场景中需要后续主场景或配置加载时可采取分帧策略，切勿在Start/Awake阻塞。
>4. 对于计算耗时 请[使用Android CPU Profiler性能调优](AndroidProfile)分析每一帧的耗时部分。

我们建议开发者[使用预下载功能](UsingPreload)，该功能可以利用此阶段的网络空闲期进行资源下载。

### 2.2.4 游戏内资源按需加载
前面我们提到开发者需要将资源从首包分离以较少首屏加载时间，同理，而对于其余的资源开发者最好使用按需加载的方式进行加载，减少玩家进行核心玩法的等待时间。
优化可参考 [使用Addressable Assets System](UsingAddressable)或[AssetBundle](UsingAssetBundle)进行资源按需加载。

### 2.3 优化总览
我们总结下启动时序以及开发者、平台提升启动性能的优化事项：
![](https://res8.wxqcloud.qq.com.cn/wxdoc/0aae474e-82cc-423a-91ef-dc6614ea3612.png)

## 三、常用启动优化技巧
当分析出小游戏需要进行启动优化时，请继续阅读：
* [使用Addressable Assets System进行资源按需加载](UsingAddressable)
* [首场景启动优化](FirstSceneOptimization)  
* [Shader 异步 Warmup](AsyncShaderWarmup)  

## 四、常用启动优化工具
### 4.1. AssetStudio(推荐)
https://github.com/Perfare/AssetStudio

一款开源的资源查看工具，可以检查data首包以及AssetsBundle(或新Addressable)的资源内容，对于分析打包的资源正确性和冗余具有很好的帮助。

### 4.2 BuildReportTool(推荐)
https://assetstore.unity.com/packages/tools/utilities/build-report-tool-8162?locale=zh-CN

很好的前端用于查看Unity编译信息，BRT显示了编译时包括的每个资源占用的存储空间以及未使用资源情况。

### 4.3 Asset Hunter
https://assetstore.unity.com/packages/tools/utilities/asset-hunter-pro-135296

资源清理插件，可将项目中无用资源清理

### 4.4 Unity Addressable Assets System   
https://docs.unity3d.com/Packages/com.unity.addressables@1.16/manual/index.html
Unity全新资源管理流程
