2017 Unity手游体检蓝皮书 — MOBA篇

  1. 云栖社区>
  2. 侑虎科技>
  3. 博客>
  4. 正文

2017 Unity手游体检蓝皮书 — MOBA篇

玄学酱 2018-02-02 16:36:00 浏览1278
展开阅读全文

一、MOBA手游总体性能开销分析

请输入图片描述
请输入图片描述

Android设备的CPU均值主体范围为16~61.2 ms,且主要集中在17~50ms范围之内。

请输入图片描述

无论是高、中、低端的Android设备,渲染、UI、加载/代码都是需要研发团队重点关注的,它们的消耗总和占了总开销的80%。

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


二、MOBA手游CPU模块性能开销分析

1、渲染模块
严重程度:地狱

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

请输入图片描述

在Draw Call使用上,MOBA手游的使用程度大幅低于MMORPG和ARPG手游,且对Draw Call的控制同样较好,UWA建议Draw Call占用的P95 < 200,86%的项目可以将其控制在这个范围内。

请输入图片描述

MOBA手游的场景渲染三角形面片数量普遍较高。且设备性能越高,数量峰值越高。经过统计,在中低端设备中,46.6%的项目能将渲染三角形面片数控制在100K以下。

2、UI模块
严重程度:地狱

请输入图片描述

使用NGUI作为UI解决方案的项目占据了相当高的比例,NGUI目前仍然是MOBA研发团队对于UI系统使用的主要解决方案。MOBA是目前手游中工程技术难度最为复杂的游戏品类之一,对于UI模块的选择,大多数团队仍然倾向于从稳定性和把控性两方面出发,这也是NGUI占比持续较高的主要原因。

下面我们将分别说明NGUI和UGUI的CPU耗时和堆内存占用情况。
请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述

UI模块的性能开销依然很高,也是我们统计中的重要性能杀手。在中低端设备上,超过80%的研发项目在UI端都面临较为严重的性能问题,主要体现在以下几个方面:
(1)同一时刻存在大量需要更新的Panel,比如,攻击时刻的血条、不断移动的伤害数字等HUD。这些在“人堆”中范围攻击时或者进攻高地时是很容易大面积出现的;
(2)不断滑动的摇杆和点击的技能icon,这些是MOBA战斗场景中使用最为频繁的UI元素,研发团队需要时刻注意这些icon的变动是否会带来较大范围内的重建。

以上情况都是MOBA项目研发团队每天面对的主要UI问题,可能一个Widget的使用疏忽,就能让研发团队的UI模块性能开销飙升一个量级。

注意:从重要函数上来看,UGUI的CPU占用大幅低于NGUI。需要说明的是,Unity 5.2版本之后已经开始将UI的部分计算操作移到子线程中进行,而主线程中的表现则为WaitingForJob、PutGeometryJobFence等,在本次报告中,我们并没有将这两项开销统计在内。

请输入图片描述

经统计,NGUI中堆内存每10000帧分配的主体范围为 5.4~53.2 MB,UGUI中堆内存每10000帧分配的主体范围在5.2 MB以内。从堆内存分配来看,UGUI远低于NGUI。

3、逻辑代码
严重程度:噩梦

请输入图片描述
请输入图片描述

1)GC触发频率很高,是造成卡顿的主要原因之一,目前只有48.7%的项目可以将GC的触发频率控制在1000帧/次以上。
2)在2016年GC平均耗时下降趋势明显,但在2017Q2出现大幅上升趋势,对此,建议研发团队在后续研发过程中对GC操作和耗时进行密切关注。

请输入图片描述
请输入图片描述

Shader.Parse 操作是比较突出的性能杀手,目前平均每次调用的CPU耗时主要分布在 6.4~171.3ms。但随着越来越多团队了解该项的耗时特性后,该项的CPU耗时呈现出较为明显的下降趋势。

4、动画模块
严重程度:噩梦

请输入图片描述
请输入图片描述

Animator.Update/Animation.Update的开销在中低端设备上的耗时呈现逐步升高趋势,对此,建议研发团队重点查看本篇文章的最后一节,我们提供了进一步完善和优化动画模块性能的相关方法。

5、粒子模块
严重程度:普通

请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述

1)粒子系统的CPU开销普遍很低,且近一年来下降趋势较为明显。
2)粒子系统的数量使用仍然较大,这会造成较高的内存占用,虽然2016 Q4和2017 Q1已经大幅下降,但2017 Q2随着新项目的增加,粒子系统的使用数量又开始大幅增加。MOBA项目中存在粒子系统数量较大的原因,主要是特效和技能的缓存所致。为了保证战斗时(特别是团队时)技能释放的流畅性,研发团队会选择在场景加载时即缓存英雄的所有技能,因此,MOBA游戏在战斗副本中会出现较大量的粒子系统缓存现象,特别需要研发团队关注。


三、MOBA手游内存模块开销分析

1、总体内存
严重程度:地狱

请输入图片描述
请输入图片描述

可以看到,MOBA游戏总体内存在2016年上升趋势明显,而在2017年内存占用则较为稳定。为了兼容市面上的中低端机,Unity引擎的实际内存占用需要尽可能被控制在300MB以下,这点是各大MOBA研发团队今年优化阶段的重中之重。

2、总体堆内存
严重程度:地狱

请输入图片描述
请输入图片描述

堆内存使用在2016年大幅下降,但今年随着新项目的涌入,其上升趋势明显,建议研发团队重点关注。对此,UWA建议重点关注以下几点:

1)严格关注配置文件的使用,避免一次性加载过大的配置文件而撑大堆内存;
2)不少项目的堆内存增大是由于热更新所致。因此,对于过大的数据Data的使用,建议通过分帧进行,并及时进行GC回收;
3)避免不必要的代码堆内存分配,虽然是老生常谈,但从趋势上可以看出,大多数研发团队仍需加强重视。

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

3、纹理资源内存
严重程度:地狱

请输入图片描述
请输入图片描述

1)纹理内存峰值主要分布为 40~147.3 MB。
2)从走势中可以看到,随着MOBA项目的精品化趋势,其纹理内存占用也大幅提升,虽然2017Q2稍有下降,但依然拥有较高的内存占用。

4、网格资源内存
严重程度:噩梦

请输入图片描述
请输入图片描述

网格资源内存峰值主要分布为 14.1~ 65.9 MB,且上升趋势明显。对于场景、角色的网格资源控制,是研发团队在后续研发团队中需要关注的重点。

5、动画资源内存
严重程度:普通

请输入图片描述
请输入图片描述

动画资源内存峰值主要分布在9.2~38.5 MB以内,从走势中可以看出,2017Q1的内存占用达到47.1MB,而2017Q2的内存占用迅速回落到18.4MB。经过进一步分析,其主要原因如下:
1)2017Q1大量新游戏的涌入直接提升了该阶段的内存占用;
2)2017Q2动画资源新优化方式的推广,大量研发团队从中受益,从而内存占用大幅回落。关于动画资源的优化建议,建议研发团队查看UWA之前推送的技术文章《Unity动画文件优化探究》。

6、Shader资源内存
严重程度:噩梦

请输入图片描述

Shader资源内存峰值占用主要集中在0.1~7.9 MB区间之内。需要提醒的是,研发团队需要密切关注Standard Shader的使用情况,因为该类Shader在解析时不仅会造成较高的CPU开销,同时会造成较大量的内存占用。

7、RenderTexture资源内存
严重程度:普通

请输入图片描述
请输入图片描述

与MMORPG和ARPG手游不同,RenderTexture在MOBA游戏中的内存占用保持在较低的水平,在2016Q3出现41.2MB的高值后,迅速回落,并稳定在25MB左右的内存占用。

8、粒子系统资源内存
严重程度:噩梦

请输入图片描述
请输入图片描述

与粒子系统的开销一致,其内存占用也在2017年呈现持续大幅上升趋势。粒子系统的内存占用主要与其内存中缓存的数量相关,对此,建议研发团队在后续研发中对粒子系统的使用进行密切关注和严格控制。


四、MOBA手游资源管理分析

请输入图片描述
请输入图片描述

在资源加载方面,AssetBundle.Load是项目中的主要加载方式,且主要集中在场景切换处。就目前的MOBA游戏而言,绝大多数项目使用的加载方式仍然是同步加载。

请输入图片描述
请输入图片描述

1)New WWW是MOBA项目中AssetBundle的主要加载方式。
2)LoadFromFile(Async)的使用在2017 Q2上大幅增加,但整体仍然较少,仅占10.5%。这主要是因为市面上仍有不少MOBA项目使用的是Unity 4.x版本所致。但如果您的项目目前是使用Unity 5.x版本开发,建议尝试升级到Unity 5.3版本以后,并通过LoadFromFile(Async)的方式进行加载。

请输入图片描述

Instantiate/Destroy和Active/Deactive调用次数较高,需要研发团队根据自身项目情况时刻注意:

1)由于Active/Deactive每次调用的CPU开销不大,且不会造成崩溃、闪退等问题,所以研发团队极易忽视这两项操作所带来的性能问题,因而出现了游戏运行1万帧Active/Deactive上万次调用的情况。因此,此处存在着很大的性能浪费;
2)Instantiate/Destroy的调用次数同样较高,但与MMORPG和ARPG游戏不同的是,Instantiate调用主要发生在场景切换处,大量GameObject在Instantiate实例化后被缓存使用,而为了保证战斗时的足够流畅,战斗过程中研发团队大多通过Active/Deactive操作来代替Instantiate/Destroy操作;
3)Destroy操作大幅高于Instantiate操作。经过进一步分析,这主要是由于当前MOBA项目中NGUI使用占比较高所致。在对NGUI制作的UI界面(比如血条等HUD)进行Deactive操作是MOBA战斗过程中较为频繁的操作,而此Deactive操作会引发UI底层Destory相关的Material操作。所以会出现Destory次数次数大幅高于Instantiate次数的情况。


五、UWA 对于MOBA手游研发团队的建议

MOBA是移动游戏研发难度较高的品类,其对于性能的严苛要求可谓达到了“寸土寸金”的地步。目前国内仍然在开发MOBA类移动游戏的,也都是技术实力与情怀兼备的团队。正因如此,MOBA游戏在很多模块中的性能表现已经较为优秀。对此,我们对于MOBA项目研发团队的优化建议如下:

1、渲染方面,Draw Call的控制技术已被MOBA研发团队所熟练掌握。随着玩家的设备质量提升,建议研发团队考虑GPU Instancing技术,该功能已经在Unity 5.5版本以后被支持,由于MOBA项目的特殊性,研发团队可以考虑将其应用在场景中的草、树木等大量重复物体重,从而进一步降低渲染模块在CPU端的开销。但是,需要注意的是,GPU Instancing的技术虽然可以降低Draw Call,但仍需要节制使用,因为其在移动设备上的GPU和能耗方面的压力可能会让你大吃一惊。

2、UI方面,与其他游戏类型一样,UI网格重建开销在未来相当长的一段时间内仍然是研发团队头痛的问题,UI优化的原则非常简单:动静分离,但真实操作起来则是非常困难。90%项目中的UI性能问题是由于动静元素没有分离导致,但没有任何两个项目的具体原因是一致的。这是UI性能优化方面非常困难的主要原因。

3、逻辑代码方面在上述报告中并没有特别谈及,这主要因为MOBA类型的项目,其在战斗时的逻辑代码开销主要为自身开销,即项目自身的AI、同步等操作,其主要包括小兵和怪物的攻击搜索、寻路操作、位置和状态的持续更新等等。对此,建议研发团队关注其AI操作的调用频率和单位开销是否合理。

4、动画模块方面,随着MOBA游戏中怪物、小兵和英雄的角色复杂程度越来越高。建议研发团队考虑通过GPU Skinning + GPU Instancing的方式缓解大量蒙皮网格在动画模块和渲染模块中的性能开销,具体做法可参见《GPU Skinning加速骨骼动画》。

5、在内存优化方面,Mono、网格和粒子系统内存占用在2017年的上升趋势非常明显,对此,建议研发团队在接下来的项目研发中密切关注这两项的内存使用。

6、资源加载方面,New WWW仍然是MOBA研发团队的主流AssetBundle加载方式,但我们建议正在使用Unity 5.x的研发团队,使用LoadFromFile(Async)的方式来对AssetBundle进行加载。对于仍然没有使用该方式的研发团队,建议查看UWA博客上的相关文档(blog.uwa4d.com),并找到对应的性能比较和分析。

7、 以上数据是我们对于MOBA手游性能数据的整体研究和趋势分析,旨在从宏观上为大家展现项目中普遍存在的性能瓶颈和研发团队容易忽视的潜在性能问题。但同样需要说明的是,优化是一个“抽丝剥茧”的过程,需要研发团队花费大量的时间和耐心去完成。UWA建议:多做测试,以数据说话,空杯心态,将经验归零。






原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

网友评论

登录后评论
0/500
评论
玄学酱
+ 关注
所属团队号: 侑虎科技