iOSOptimization.md 5.7 KB
Newer Older
ocean2o11's avatar
ocean2o11 已提交
1
# iOS高性能模式
ocean2o11's avatar
ocean2o11 已提交
2 3 4 5 6 7 8 9 10

## 什么是高性能模式
在iOS环境下,标准的微信小游戏WASM运行模式是无JIT, 对于计算性能要求较高的游戏会受到比较大的限制。常见情况是:
1. 中低端机帧率较低,流畅度难以达到上线标准
2. 对CPU计算资源消耗过高,运行一段时间后设备温度持续上升

小游戏环境框架提供了高性能运行模式,该运行模式下CPU算力得到明显提升。但该模式也存在更严格的内存与代码包体限制,需要开发者采取合适的手段以达到最优。

## 性能提升
ocean2o11's avatar
ocean2o11 已提交
11 12
### CPU消耗
通过多款游戏项目,我们得到实际游戏项目的CPU占用如下图所示:
ocean2o11's avatar
ocean2o11 已提交
13

O
oceanxiao 已提交
14
<img src='../image/iosoptimization3.png' width="500"/>
ocean2o11's avatar
ocean2o11 已提交
15 16 17 18 19 20 21

我们得到以下结论:
- 高性能模式在长期执行过程中CPU明显低于普通模式,后者长期处于高CPU占用因此长期运行容易越来越烫
- 游戏启动初始阶段,高性能模式存在CPU高峰用于WebAssembly编译优化
- 采用[代码分包](WasmSplit.md)后,高性能模式能较快回落CPU占用并处理较优水平

### 压力测试
ocean2o11's avatar
ocean2o11 已提交
22 23 24 25 26 27 28 29 30 31
使用Unity所提供的Benchmark Demo的部分案例进行评测:
- Instntiate & Destroy
- Animation & Skinning
- Physics Cubes
- AI Agents 

测试过程为不断增加运算复杂度,直到帧率下降到特定数值。

分数越高,代表的运行能力越强。

O
oceanxiao 已提交
32 33
<img src='../image/iosoptimization1.png' width="250"/>
<img src='../image/iosoptimization2.png' width="250"/>
ocean2o11's avatar
ocean2o11 已提交
34 35 36 37 38 39 40

上图分别是iOS端普通模式与高性能模式的得分,可以看到在几个压测示例中高性能模式均明显优于普通模式。

经实际游戏测试,游戏帧率都会得到明显改善,虽无法达到Benchmark几乎一个数量级的差异。

## 如何开通

ocean2o11's avatar
ocean2o11 已提交
41 42
iOS端小游戏高性能模式适用于遇到iOS环境运行性能不足,运行发烫的小游戏。
- 需要该能力的开发者登录[微信公众平台](https://mp.weixin.qq.com) -> 首页能力地图模块 -> 点击进入"生产提效包" -> 点击开通高性能模式。 
43
<img src="../image/mp_addplugin.png">
ocean2o11's avatar
ocean2o11 已提交
44
- 开通成功后,过配置 game.json 的 iOSHighPerformance 为 true 则可进入高性能模式,通过去掉此开关可以正常回退到普通模式,以便两种模式对比。
ocean2o11's avatar
ocean2o11 已提交
45

ocean2o11's avatar
ocean2o11 已提交
46
## 高性能模式限制
ocean2o11's avatar
ocean2o11 已提交
47
### 内存限制
ocean2o11's avatar
ocean2o11 已提交
48
高性能模式下,iOS低端机(6s/7/8等)2G RAM机型的内存限制为1G,中高端机(7P/8P/iPhoneX/XSAMX/11/12等)3G以上内存机型的内存限制为1.4G,因此开发者务必保证内存峰值不超过该数值。
ocean2o11's avatar
ocean2o11 已提交
49

ocean2o11's avatar
ocean2o11 已提交
50
建议开发者根据指引[优化Unity WebGL的内存](OptimizationMemory.md),如[压缩纹理优化](CompressedTexture.md)等方式。
ocean2o11's avatar
ocean2o11 已提交
51 52 53 54

### 代码体积限制
高性能模式下,WASM代码将被编译并优化,需要占用更多的编译消耗与内存。如果未进行优化前,可以明显感受到启动开始阶段(如启动前1分钟内)设备发烫。

ocean2o11's avatar
ocean2o11 已提交
55
建议开发者使用[代码分包工具](WasmSplit.md)减少代码包体积。
ocean2o11's avatar
ocean2o11 已提交
56 57

## QA
ocean2o11's avatar
ocean2o11 已提交
58 59
1. 如何判别游戏否已经开启了高性能模式?
   - 删除本地小游戏(包括开发版、体验版和正式版),
ocean2o11's avatar
ocean2o11 已提交
60 61 62
   - 重新进入小游戏并打开调试,查看vconsole日志, 关注"game start"日志中的"render"字段为"h5"则为高性能模式
   - 系统和基础库要求是: iOS>=14.0, 基础库>=2.23.1, 用户占比约为75%。 对于不满足此要求时回退为普通执行方式。

ocean2o11's avatar
ocean2o11 已提交
63 64
2. 使用高性能模式下,游戏本身是否需要做修改?  
   - 业务代码无需做任何调整,普通模式与高性能模式可以无缝切换。
ocean2o11's avatar
ocean2o11 已提交
65
   - 高性能模式下,请不要服务端设置Cookie,游戏端内因为跨域问题会读取不到Cookie
ocean2o11's avatar
ocean2o11 已提交
66
   - Android下载资源无问题,高性能模式提示资源下载失败等网络问题,请参考文档[网络通信适配](UsingNetworking.md#注意事项)关于跨域的问题 
ocean2o11's avatar
ocean2o11 已提交
67

ocean2o11's avatar
ocean2o11 已提交
68
3. iOS报错提示未开启gzip/br压缩
Z
zhangjunkunn 已提交
69

Z
zhangjunkunn 已提交
70
<img src='../image/contentencoding_error.png' width="500">
Z
zhangjunkunn 已提交
71

ocean2o11's avatar
ocean2o11 已提交
72
可通过微信开发者工具查看Content-Encoding是否为gzip或br
Z
zhangjunkunn 已提交
73

Z
zhangjunkunn 已提交
74
如果有正确压缩,可忽略这个错误。
Z
zhangjunkunn 已提交
75

Z
zhangjunkunn 已提交
76
问题原因:由于跨域获取不到Content-Encoding头
Z
zhangjunkunn 已提交
77

Z
zhangjunkunn 已提交
78
解决办法:增加跨域头部`"Access-Control-Expose-Headers": "Content-Length, Content-Encoding",`
Z
zhangjunkunn 已提交
79

Z
zhangjunkunn 已提交
80 81
<img src="../image/devtools_network.png" width="500">

ocean2o11's avatar
ocean2o11 已提交
82
4. 资源下载提示`isTrusted`
Z
zhangjunkunn 已提交
83

Z
zhangjunkunn 已提交
84
<img src='../image/cors_istrusted.png' width='500'>
Z
zhangjunkunn 已提交
85

ocean2o11's avatar
ocean2o11 已提交
86 87
多半由于跨域问题导致,可通过开发者工具查看对应资源的Response Header是否有跨域头,
请参考文档[网络通信适配](UsingNetworking.md#注意事项)关于跨域的问题 
Z
zhangjunkunn 已提交
88

ocean2o11's avatar
ocean2o11 已提交
89
5. 卡在启动封面无法启动
ocean2o11's avatar
ocean2o11 已提交
90 91
   - 右上角打开调试,重启小游戏,点三次下方的Unity logo打开vconsole
   - 如果出现资源访问失败,但Android和开发者工具却可以下载则参考QA3关于跨域问题
O
oceanxiao 已提交
92
   - 15.4以上系统出现"Not implemented"与内存问题,此为Unity & iOS 15.4的BUG,微信提供的wasm代码分包(推荐)或Unity WebGL官方论坛的[临时修复方案](https://forum.unity.com/threads/ios-15-webgl-2-issue.1176116/page-2)
ocean2o11's avatar
ocean2o11 已提交
93

ocean2o11's avatar
ocean2o11 已提交
94
6. 个别游戏UI会出现闪烁问题
ocean2o11's avatar
ocean2o11 已提交
95 96
   - 已知iOS 15.4偶现,如果开发者遇到请提供可复现Unity工程联系minigamedevop08

ocean2o11's avatar
ocean2o11 已提交
97
7. 为什么开启了高性能模式,游戏启动很烫?
ocean2o11's avatar
ocean2o11 已提交
98 99
   - 请参考本文前面部分,如果未使用代码分包的情况下JIT编译优化将耗费大量性能

ocean2o11's avatar
ocean2o11 已提交
100
6. 使用高性能模式下,必须如果不优化内存和代码包体积可以吗?
ocean2o11's avatar
ocean2o11 已提交
101 102
   - 不建议。如果不做任何优化的情况下,很有可能会遇到超出内存限制而崩溃,启动时发烫现象严重等问题。

O
oceanxiao 已提交
103
7. iOS高性能模式与安卓性能对比如何?
ocean2o11's avatar
ocean2o11 已提交
104
   - 两种系统环境下,WASM执行都是JIT代码。但由于底层虚拟机差异过大以及自身不断迭代,难以横向对比。