UWA发布 | Unity手游体检蓝皮书

UWA发布 | Unity手游体检蓝皮书

作为游戏行业的服务商,UWA不仅为游戏开发者提供高效的性能优化工具,也致力于为行业提供更全面、更具体的信息和服务。为此,UWA今天发布2018-2019年度手游蓝皮书,从总体性能数据、引擎各模块开销、内存占用等方面进行汇总分析,呈现Unity手游行业现状。

这是侑虎科技原创文章,欢迎转发分享,未经官方授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群793972859)


MMORPG作为目前游戏市场上的头部力量,在UWA测评过的项目中,也占据了主要份额,因此我们以该类型的测评数据为例,为大家呈现2018-2019年的手游性能现状和发展趋势。

报告目录:

1)MMORPG手游总体性能开销分析
2)MMORPG手游CPU模块性能开销分析
3)MMORPG手游内存模块性能开销分析
4)MMORPG手游资源管理分析
5)UWA对于MMORPG手游研发团队的建议


◆◆◆◆

MMORPG手游总体性能开销分析

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

按照UWA官网的测评机型分类,我们将统计的性能数据分为低端、中端和高端;在趋势图中则直接以最具有代表性的低端和高端来展现。

1)大部分MMORPG手游在中低端设备的性能开销较高,大于33ms的耗时占比范围在50%~70%。

2)在过去的4个季度中,我们看到高端设备上的性能走势较为平稳,但低端设备上的耗时在刚刚过去的一个季度中大幅飙升。这是因为在刚刚过去的一个季度,提测的超大场景的MMO新游戏明显增多。大量的PBR材质和图像后处理,使得低端设备上的开销大幅上升。这些新游戏中大多还未根据机型进行明显的分级,随着研发过程的推进,我们预计今年底在中低端设备上的整体性能耗时将会回落。

无论是高、中和低端的Android设备,渲染、UI和逻辑代码都是需要研发团队重点关注的,它们的消耗总和占了总开销的80%。在绝大多数MMO游戏项目中,这三者都是研发团度需要关注的优化重点。

下面我们就来具体分析这些主流模块的开销情况。


◆◆◆◆◆

MMORPG手游CPU模块性能开销分析

一、渲染模块

严重程度:地狱

为了能够更好地反映出各个性能参数的整体使用情况,我们统计了每种性能参数的主体使用范围,其范围区间是[5%~95%],以下数据中P5代表5%,P50代表均值,P95代表95%。

在过去的4个季度中,半透明渲染和不透明渲染在高端设备上的CPU耗时起伏较大,特别是不透明渲染,在2019 Q1升高到3.8ms,但在2019 Q2阶段则大幅下降,降低到3.1ms。但在低端设备上,无论是不透明渲染还是半透明渲染,其耗时都呈现上升趋势。这确实与MMO游戏的体量越来越大相关。在2019年的大型MMO游戏中,我们关注到了两种现象值得研发团队后续关注:

1)GPU Instancing技术的大量使用

该技术可有效降低Draw Call的占用,从而对渲染模块的CPU端压力起到一定的缓解作用。但是,在使用该技术时,需要注意机型的测试,一些低端设备虽然支持OpenGL ES 3.0,且SystemInfo.supportsInstancing API返回也为True,但经过测试时,其底层并没有按照真实的GPU Instancing功能来进行渲染,而是通过逐个Draw Call来进行渲染,所以,虽然开启了GPU Instancing功能,但其渲染耗时并没有下降。

那么如何解决?我们今年更新了UWA GOT Online中Draw Call的统计方式,直接获取真实渲染底层的Draw Call调用情况并进行展示,同时对不同渲染模式的Draw Call进行区分,这样GPU Instancing功能是否起作用,通过报告直接看,一目了然。

2)GPU端压力越来越大

PBR、图像后处理的大量使用会导致GPU端的压力越来越大,甚至影响到了CPU端的Draw Call无法正常传输。这其中也跟不同的机型和不同的芯片型号相关,有些则反映到每个Draw Call的提交耗时随着GPU端的压力而无法增大,而且表现方式则是渲染线程等待GPU、主线程等待渲染线程的情况,具体耗时因芯片和具体渲染情况的不同,则是会表现在Mesh.Render、RenderLoop的自身开销和Camera.Render的自身开销中。在部分Unity版本中,由于引擎一些自身设计原因,也会体现到粒子系统的UpdateAll相关函数中。可以说,主线程等待时间的体现方式因芯片的不同、具体使用情况的不同和引擎版本的不同,可谓是五花八门,受篇幅限制,在这里不一一进行说明,但归根原因主要还是GPU压力过大。对此,对于中低端设备上GPU端OverDraw、Bandwidth和ALU的控制是接下来重型MMO研发团队需要特别注意的点,特别是还有出海计划的MMO游戏。

随着Android设备整体性能的不断提升,我们对于不同档次机型的Draw Call数和面片数量推荐值,正在进行大力分析和研究。就目前的数据分析结果表明,Draw Call是渲染模块CPU端的重要杀手,材质切换次之,然后才是面片数量。而面片数量的对于性能的影响主要是局限在GPU端。具体的分析说明请查看:《万物皆数-深挖UWA Benchmark之渲染篇》


二、逻辑代码

严重程度:地狱

1)GC触发频率很高,仍然是目前造成卡顿的主要原因之一,但是,今年可以将GC的触发频率控制在1000帧/次以上的项目占比达到了33%,较之去年提高了将近10个百分点。

2)随着MMORPG游戏越来越重度化,GC平均耗时在逐步上升。对此,一方面,仍然建议研发团队对游戏运行时堆内存的分配通过UWA GOT Online来进行及时分析和优化。同时,目前项目中驻留Mono堆内存最大的一项则普遍是配置文件的内存占用所致。其表现情况是游戏启动后,一分钟之内的Mono堆内存就可以达到50MB以上的占用,如下图所示。

对此,我们在UWA DAY 2019上对目前市面上大量项目的配置文件使用情况进行了分析,如下图所示。

就目前来说,大部分游戏团中使用的配置文件读取方式都不够高效,且堆内存占用较高,我们在会上对主流使用框架进行了测评,建议配置文件堆内存分配较高的团队尽可能尝试使用ProtoBuff或者FlatBuffers等开源库,使得堆内存占用进一步降低。

同时,Unity引擎在2018.3版本中加入了对于GC调用的控制,研发团队可以尝试通过API开控制何时开启和关闭GC.Collect,这对保持高帧率有很高需求的时刻(如:群战、打Boss)有很大的帮助。另外,Unity 2019.1版本以后加入了Incremental GC功能,建议使用该版本以上研发的开发团队进行关注。

我们可以看到,在过去的四个季度中,Instantiate耗时趋势较为平缓,低端设备中的耗时在3.0~3.5ms区间,高端设备中的耗时在2.1~2.7ms区间。

在我们驻场优化的项目中,我们看到项目运行时仍然会有大量的GameObject在频繁实例化和Destroy。对此,我们建议研发团队重点查看UWA线上性能报告中资源管理分类的“资源实例化/激活”页面,通过它可以快速掌握到底具体哪些GameObject在不停地被执行实例化操作,从而更为高效地减少不必要的性能开销。

Shader.Parse 操作是比较突出的性能杀手,目前平均每次调用的CPU耗时主要分布在 22.5~56.5ms。这里需要研发团队最需要关注以下三点:

1)Shader在游戏运行过程中是否存在冗余情况,即重复加载的情况;
2)是否有自定义的Shader资源放入到Always Included中,如有,请尽量去除;
3)移动端上Standard Shader的使用是否确实有必要。没有必要,则详细检测并删除。


三、UI模块

严重程度:地狱

目前我们主要统计了NGUI和UGUI的占比以及详细的使用情况,在UWA测评过的项目中,还存在一些其它UI插件比如FairyGUI,基于目前数量较少,并未加入统计。

去年的报告中,我们看到了UGUI的使用占比呈现反转的趋势,一跃达到60%+的占比。而在刚刚过去的四个季度中,UGUI的使用占比依然强势,最高时可达76%。

下面我们将分别说明NGUI和UGUI的CPU耗时和堆内存占用情况。

UI模块的性能开销依然很高,但相较于去年相比确实有进一步提升。这主要是在这一年多以来,各大研发团队对于UGUI的理解和掌握都在不断深入。当然,现在UGUI的明显性能问题主要有以下四方面:

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

针对以上问题,大家可以通过UWA学堂中UI相关的相关技术问题和视频进行学习和了解,相信对帮助大家快速提升UI方面的技术理解大有裨益。


四、动画模块

严重程度:普通

动画模块在最近一年来的性能表现一直较为平稳,这说明大家对于动画模块中应有的性能优化点掌握已经较为到位。虽然MMO项目中的角色、NPC和怪物等数量持续有在增加,但在这些模型多数是通过GPU Skinning的方式来完成。这种方式对于实现场景中的大量同种怪物非常有效。


五、物理模块

严重程度:普通

物理模块的性能普遍较好,且出现了持续下降的趋势。对于使用Unity 2017.4版本以后的团队,Auto Simulation和Auto Sync Transforms是大家需要关心的参数,以避免不必要的性能耗时。


六、粒子模块

严重程度:普通

粒子系统的CPU开销普遍较低,但总体使用数量峰值在2019 Q2后大幅上升。我们依然建议研发团队尽可能将数量峰值控制在600以下(低端设备)和1000以下(中高端设备)。对此,建议研发团队经常通过以下两方面来检测自己的粒子特效使用情况:

1)粒子系统(特别是技能特效)的配置文件是否过量;
2)特效中是否含有长久不用的粒子系统。


◆◆◆◆◆

MMORPG手游内存模块开销分析

一、内存泄露

严重程度:噩梦

内存泄露问题在过去的一年中得到了很大的改善,虽然2019 Q2的泄露项目占比有所回升,达到了33%,但相较于去年同期(2018 Q2为55%)仍然下降了22%。

内存泄露的问题得以很好的解决,主要还是因为大家可更为直观、精准地查看其具体泄露的C#函数和Lua函数。对此,我们建议研发团队后续可更为频繁地进行检测和监控,即可进一步降低堆内存泄露的风险。研发团队可通过以下两种方式高效地对堆内存泄露函数进行分析和优化:

1)UWA GOT Online中的详细Mono堆内存分析和Lua性能分析报告
2)UWA线上深度测评中的详细Mono堆内存测评报告


二、总体内存

严重程度:地狱

总体内存在最近的一年里,峰值均值稳步提升,共计提升了85MB。随着高端移动设备的普及、MMO游戏的逐步重度化,内存逐步提升是一个必然的趋势。目前,项目中的主要内存瓶颈依然是资源和Mono堆内存。对此,我们将在接下来的文章中进行详细分析。


三、总体堆内存

严重程度:地狱

总体堆内存在最近一年里上升趋势非常明显,这主要是游戏的重度化所致。但另一方面,也是研发团队对于Mono堆内存分配的疏于管理所致。就目前而言,Mono堆内存过高主要是因为配置文件的序列化库使用不当所致,这是UWA在接下来一年中所要攻坚的重点,让研发团队能够更为合理地对序列化信息进行管理。

项目的内存占用很大一部分来自于资源的使用,下面我们将对项目中主流资源的使用情况进行分析。


四、纹理资源内存

严重程度:地狱

如上图所示,对于纹理资源来说,在过去的4个季度中,其内存占用处于震荡阶段。目前,大多数团队对于纹理的使用格式都已经有了清晰的认识,建议研发团队对于纹理Mipmap使用情况、渲染利用率等进行进一步的检测和完善。


五、网格资源内存

严重程度:地狱

1)网格资源内存峰值主要分布为12.7~ 96.1 MB,且主要集中在60MB以内。
2)MMORPG游戏的场景普遍较大、角色普遍较多,因此,其网格资源量明显高于其它类型游戏。但从使用趋势上来看,其最近一年的使用趋势较为平稳,均值均在50MB上下浮动。


六、动画资源内存

严重程度:普通

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


七、Shader资源内存

严重程度:普通

Shader内存占用的上升趋势较为明显,但本身内存占用很小。这里,UWA仍然需要提醒的是,Standard Shader在大家的项目中被经常误引入进来,建议大家在UWA性能简报中的“具体资源使用信息”中特别关注Standard Shader的使用情况。


八、RenderTexture资源内存

严重程度:噩梦

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


九、粒子系统资源内存

严重程度:噩梦

粒子系统的使用数量过大,从而导致其内存占用过高。对此,其最有效的优化方法还是降低粒子系统的使用数量。


◆◆◆◆

MMORPG手游资源管理分析

AssetBundle加载方式(Load和LoadAsync)的使用占比在过去的一年中都保持在80%左右。毫无疑问,AssetBundle加载方式是目前绝大多数研发团队的资源加载首选。

在接下来的一年中,我们建议大家使用AUP(Async Upload Pipleine)功能来尝试达到更高的加载效率。关于AUP中需要特别关注的技术点,建议查看UWA DAY 2019中的相关分享《Unity引擎加载模块和内存管理的量化分析及优化方法》

LoadFromFile加载方式一家独大,其使用占比从去年的74%增涨到今年的94%。LoadFromFile+LZ4的组合在移动游戏中加载性能优势明显,已经逐步成为了移动游戏资源加载的不二选择。

1)对于Instantiate/Destroy的完善,研发团队时刻关注缓存池的使用是否合理;

2)对于Active/Deactive的完善,则需要研发团队尽可能注意避免UI和动画角色的频繁调用,从而尽可能避免不必要的调用开销。


◆◆◆◆◆

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

1、 警惕渲染模块、逻辑代码和UI模块这三大性能杀手!随着精品化MMORPG项目的日益增多,这三项在接下来依然是研发团队在性能优化时的重中之重!

2、 内存泄露问题在今年的项目研发中得到了相当大的缓解,项目占比较之去年同期下降了22%,在UWA线上测评报告UWA GOT中的内存泄露分析功能的支持下,我们相信研发团队不仅可以快速检测和定位堆内存的具体泄露问题和出处,还可以高效对其进行完善和修复。

3、 在内存优化方面,Mono堆内存、纹理、网格、RenderTexture和粒子系统依然是大家接下来需要关注的重点。特别是Mono堆内存部分,对于序列化信息的管理已经刻不容缓,在接下来的一年,UWA会尽可能为各大研发团队解决和监控这一内存难题。

4、 资源加载方面,LoadFromFile(Async)已经是移动游戏项目中的主流加载方式,AssetBundle.Load(Async)同样也是资源加载的主流方式。接下来的一年中,LoadAsync方式和AUP功能将在各大团队中使用,这一方面建议国内各大研发团队开始着手进行学习和研究。

5、GPU性能问题在过去的一年中逐步凸显,在不少超重度MMO游戏中,GPU已经俨然成了游戏项目的主要瓶颈,对此,建议研发团队对于OverDraw、BandWidth和ALU进行密切关注,UWA在驻场深度优化过程中,就这三方面的性能瓶颈不断进行分析和研究,后续待成熟后会向大家进行有针对性的分享。

*本报告中的数据最终解释权归UWA所有。