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
  1. GC触发频率很高,是造成卡顿的主要原因之一,目前只有36.8%的项目可以将GC的触发频率控制在1000帧/次以上。
  2. 随着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的明显性能问题主要有以下四方面:

  1. Draw Call
  2. 重建
  3. OverDraw
  4. 主线程阻塞

内存

内存泄漏

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%
  1. 网格资源内存峰值主要分布为12.7~ 96.1 MB,且主要集中在60MB以内。
  2. 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问题最多的规则

  1. 尺寸过大的纹理
  2. 面片数过大的网格
  3. 纯色紋理
  4. 包含空纹理采样的材质
  5. 未开启OptimizeGameObjects的Animator组件
  6. 包含scale曲线的动画片段
  7. 精度过高的动画片段
  8. 包含无用纹理采样的材质
  9. 粒子数上限超过30的粒子系统
  10. 引用纹理尺寸大于256的粒子系统

UWA 对于MMORPG手游研发团队的建议

  1. 警惕渲染模块、逻辑代码这两大性能杀手!随着精品化MMORPG项目的日益增多,这两项在接下来依然是研发团队在性能优化时的重中之重!
  2. 内存泄露问题在过去的一年有恶化趋势,数据显示40%的项目存在着泄露问题,Mono堆内存、纹理、网格、RenderTexture和粒子系统依然是大家接下来需要关注的重点。特别是Mono堆内存部分,对于序列化信息的管理已经刻不容缓,在接下来的一年,UWA会尽可能为各大研发团队解决和监控这一内存难题。建议通过Mono和Asset模式持续监控。
  3. 资源加载方面,在过去的一年中,LoadFromFile(Async)已经是移动游戏项目中的主流加载方式,AssetBundle.Load(Async)同样也是资源加载的主流方式,并且取得了明显的效果,UWA也建议国内各大研发团队开始着手进行学习和研究。
  4. GPU性能问题在过去的一年中逐步凸显,在不少超重度MMO游戏中,GPU已经俨然成了游戏项目的主要瓶颈,对此,建议研发团队通过GOT Online的Overview模式检测GPU耗时,从而定位GPU的瓶颈。