UWA 2020年Unity手游性能蓝皮书内容提炼(MMORPG)

前言

数据完全来自:UWA发布|Unity手游性能蓝皮书

提取蓝皮书中的重点数据,原文中用柱状图更直观对比不同数据的差异大小,本文直接用表格形式更直观了解具体数值本身。

数据应该是UWA收集到的各产品实际数据(MMORPG类型),不构成性能指标指导。

CPU

CPU耗时均值

-\ ms< 1717-3333-50> 50
主体范围10%48%25%17%

Android设备的CPU均值主体范围为14.7~78.9 ms,且主要集中在17 ~ 33ms和33 ~ 50ms两档。

CPU耗时均值占用分布

模块占用百分比
渲染36%
代码32%
UI9%
动画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调用频率分布

机型\ 帧/次< 300300-600600-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)< 200200-400400-600> 600
高端0%16%35%48%
低端0%35%40%25%

目前,项目中的主要内存瓶颈依然是资源和Mono堆内存。

总体堆内存峰值分布

机型\ 内存(MB)< 4040-8080-120> 120
高端4%34%29%24%
低端4%42%29%34%

Mono堆内存过高主要是因为配置文件的序列化库使用不当所致。

网格内存峰值分布

机型\ 内存(MB)< 2020-4040-60> 60
高端8%22%20%50%
低端9%21%33%37%
  1. 网格资源内存峰值主要分布为12.7~ 96.1 MB,且主要集中在60MB以内。
  2. MMORPG游戏的场景普遍较大、角色普遍较多,因此,其网格资源量明显高于其它类型游戏。但从使用趋势上来看,其最近一年的使用趋势较为平稳,均值均在50MB-80MB浮动。

动画资源内存分布

机型\ 内存(MB)< 1515-3030-45> 45
高端20%36%24%19%
低端28%47%19%6%

动画模块的内存使用趋势较为平稳,平均峰值内存长期控制在20~40MB区间之内。

RenderTexture资源内存分布

机型\ 内存(MB)< 1010-2020-30> 30
高端2%7%10%80%
低端7%23%25%45%

RenderTexture的内存占用在进入2020年Q1以后上升趋势明显,特别是在低端设备上,随着大家对于图像后处理效果的需求提升,后续很可能会出现RenderTexture使用程度大幅提升的情况,因此,建议研发团队对RenderTexture密切关注。

粒子系统资源内存

机型\ 内存(MB)< 1010-2020-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的瓶颈。

游戏开发者(萌新