UWA 2020年Unity手游性能蓝皮书内容提炼(MMORPG)
UWA 2020年Unity手游性能蓝皮书内容提炼(MMORPG)
前言
数据完全来自:UWA发布|Unity手游性能蓝皮书
提取蓝皮书中的重点数据,原文中用柱状图更直观对比不同数据的差异大小,本文直接用表格形式更直观了解具体数值本身。
数据应该是UWA收集到的各产品实际数据(MMORPG类型),不构成性能指标指导。
CPU
CPU耗时均值
-\ ms | < 17 | 17-33 | 33-50 | > 50 |
---|---|---|---|---|
主体范围 | 10% | 48% | 25% | 17% |
Android设备的CPU均值主体范围为14.7~78.9 ms,且主要集中在17 ~ 33ms和33 ~ 50ms两档。
CPU耗时均值占用分布
模块 | 占用百分比 |
---|---|
渲染 | 36% |
代码 | 32% |
UI | 9% |
动画 | 6% |
粒子系统 | 4% |
物理 | 3% |
无论是高、中和低端的Android设备,渲染和逻辑代码都是需要研发团队重点关注的,它们的消耗总和占了总开销的近70%。逻辑代码的耗时占比依然很高,这主要与角色、怪物的数量越来越多相关。随着其不断增加,逻辑状态的更新开销、AI开销等都在大幅增加,这是需要游戏研发团队中密切关注的耗时瓶颈。
渲染模块
半透明渲染CPU耗时主体范围分布
机型 | 耗时(ms) |
---|---|
高端 | 0.1-4.6 |
中端 | 0.1-8.3 |
低端 | 0.1-7.4 |
UWA推荐值:< 5ms
不透明渲染CPU耗时主体范围分布
机型 | 耗时(ms) |
---|---|
高端 | 0-5.5 |
中端 | 0.9-5.9 |
低端 | 0.7-6.4 |
UWA推荐值:< 3ms
DrawCall数量主体范围分布
机型 | 数量 |
---|---|
高端 | 58-320 |
中端 | 50-246 |
低端 | 51-233 |
Triangle数量主体范围分布
机型 | 数量 |
---|---|
高端 | 101-2100 |
中端 | 81-937 |
低端 | 69-644 |
这里单位是k,可以看出部分手游峰值已经去到200w面了
GC调用频率分布
机型\ 帧/次 | < 300 | 300-600 | 600-1000 | > 1000 |
---|---|---|---|---|
高端 | 10% | 30% | 30% | 30% |
低端 | 11% | 20% | 24% | 44% |
GC调用平均耗时
机型 | 耗时(ms) |
---|---|
高端 | 120-270 |
低端 | 90-130 |
- GC触发频率很高,是造成卡顿的主要原因之一,目前只有36.8%的项目可以将GC的触发频率控制在1000帧/次以上。
- 随着MMORPG游戏越来越重度化,GC平均耗时在逐步上升。GC耗时会逐渐成为游戏运行时的主流性能杀手,需要研发团队时刻注意!
UI(UGUI)
CPU耗时主体范围分布
机型 | 耗时(ms) |
---|---|
高端 | 0.2-4.8 |
中端 | 0.3-9.8 |
低端 | 0.3-9.5 |
UWA推荐值:< 5ms
Canvas.BuildBatch CPU耗时
机型 | 耗时(ms) |
---|---|
高端 | < 1.3 |
中端 | < 3.6 |
低端 | < 4.1 |
Canvas.SendWillRenderCanvas CPU耗时
机型 | 耗时(ms) |
---|---|
高端 | < 3.6 |
中端 | < 5.0 |
低端 | < 5.3 |
堆内存主体范围
UGUI: < 30MB
UI模块的性能开销依然很高,但相较于去年相比确实有进一步提升。这主要是在这一年多以来,各大研发团队对于UGUI的理解和掌握都在不断深入。当然,现在UGUI的明显性能问题主要有以下四方面:
- Draw Call
- 重建
- OverDraw
- 主线程阻塞
内存
内存泄漏
40%项目存在内存泄露问题
总体内存峰值分布
机型\ 内存(MB) | < 200 | 200-400 | 400-600 | > 600 |
---|---|---|---|---|
高端 | 0% | 16% | 35% | 48% |
低端 | 0% | 35% | 40% | 25% |
目前,项目中的主要内存瓶颈依然是资源和Mono堆内存。
总体堆内存峰值分布
机型\ 内存(MB) | < 40 | 40-80 | 80-120 | > 120 |
---|---|---|---|---|
高端 | 4% | 34% | 29% | 24% |
低端 | 4% | 42% | 29% | 34% |
Mono堆内存过高主要是因为配置文件的序列化库使用不当所致。
网格内存峰值分布
机型\ 内存(MB) | < 20 | 20-40 | 40-60 | > 60 |
---|---|---|---|---|
高端 | 8% | 22% | 20% | 50% |
低端 | 9% | 21% | 33% | 37% |
- 网格资源内存峰值主要分布为12.7~ 96.1 MB,且主要集中在60MB以内。
- MMORPG游戏的场景普遍较大、角色普遍较多,因此,其网格资源量明显高于其它类型游戏。但从使用趋势上来看,其最近一年的使用趋势较为平稳,均值均在50MB-80MB浮动。
动画资源内存分布
机型\ 内存(MB) | < 15 | 15-30 | 30-45 | > 45 |
---|---|---|---|---|
高端 | 20% | 36% | 24% | 19% |
低端 | 28% | 47% | 19% | 6% |
动画模块的内存使用趋势较为平稳,平均峰值内存长期控制在20~40MB区间之内。
RenderTexture资源内存分布
机型\ 内存(MB) | < 10 | 10-20 | 20-30 | > 30 |
---|---|---|---|---|
高端 | 2% | 7% | 10% | 80% |
低端 | 7% | 23% | 25% | 45% |
RenderTexture的内存占用在进入2020年Q1以后上升趋势明显,特别是在低端设备上,随着大家对于图像后处理效果的需求提升,后续很可能会出现RenderTexture使用程度大幅提升的情况,因此,建议研发团队对RenderTexture密切关注。
粒子系统资源内存
机型\ 内存(MB) | < 10 | 10-20 | 20-40 | > 40 |
---|---|---|---|---|
高端 | 38% | 42% | 15% | 5% |
低端 | 46% | 40% | 12% | 2% |
粒子系统的使用数量过大,从而导致其内存占用过高。对此,其最有效的优化方法还是降低粒子系统的使用数量,同时研发团队可以考虑在高端设备上使用GPU Particle 新功能,将大幅度提升粒子模块的性能。
Top10问题最多的规则
- 尺寸过大的纹理
- 面片数过大的网格
- 纯色紋理
- 包含空纹理采样的材质
- 未开启OptimizeGameObjects的Animator组件
- 包含scale曲线的动画片段
- 精度过高的动画片段
- 包含无用纹理采样的材质
- 粒子数上限超过30的粒子系统
- 引用纹理尺寸大于256的粒子系统
UWA 对于MMORPG手游研发团队的建议
- 警惕渲染模块、逻辑代码这两大性能杀手!随着精品化MMORPG项目的日益增多,这两项在接下来依然是研发团队在性能优化时的重中之重!
- 内存泄露问题在过去的一年有恶化趋势,数据显示40%的项目存在着泄露问题,Mono堆内存、纹理、网格、RenderTexture和粒子系统依然是大家接下来需要关注的重点。特别是Mono堆内存部分,对于序列化信息的管理已经刻不容缓,在接下来的一年,UWA会尽可能为各大研发团队解决和监控这一内存难题。建议通过Mono和Asset模式持续监控。
- 资源加载方面,在过去的一年中,LoadFromFile(Async)已经是移动游戏项目中的主流加载方式,AssetBundle.Load(Async)同样也是资源加载的主流方式,并且取得了明显的效果,UWA也建议国内各大研发团队开始着手进行学习和研究。
- GPU性能问题在过去的一年中逐步凸显,在不少超重度MMO游戏中,GPU已经俨然成了游戏项目的主要瓶颈,对此,建议研发团队通过GOT Online的Overview模式检测GPU耗时,从而定位GPU的瓶颈。