一、ARPG手游总体性能开销分析
iOS设备的CPU性能普遍高于Android设备,Android设备的CPU均值主体范围为12.4~66.2 ms,iOS设备的CPU均值主体范围为7.0~57.5 ms。
我们选择了测评次数最多的四款机型来进行统计,这四款机型分别是红米2、红米Note2、华为6Plus和三星S6。
1)大部分ARPG手游在中低端设备的性能开销较高,在Android设备上,CPU耗时集中在17~50ms区间,而在iOS设备上,CPU耗时集中在33ms以内。
2)相较2016年同期,2017 Q2 ARPG手游在低端设备上的CPU开销均值增长5.8 ms。
无论是高、中、低端的Android设备,渲染、UI、加载/代码都是需要研发团队重点关注的,它们的消耗总和占了总开销的80%。
下面我们就来具体分析这些主流模块的开销情况。
二、ARPG手游CPU模块性能开销分析
1、渲染模块
严重程度:地狱
为了能够更好地反映出各个性能参数的整体使用情况,我们统计了每种性能参数的主体使用范围,其范围区间是[5%~95%],以下数据中P5代表5%,P95代表95%。
在Draw Call使用上,ARPG手游的使用程度略低于MMORPG手游,且对Draw Call的控制同样较高,UWA建议Draw Call占用的P95 < 200,76.3%的项目可以将其控制在这个范围内。
1)ARPG手游的场景渲染三角形面片数量普遍较高。且设备性能越高,数量峰值越高。经过统计,在中低端设备中,46.5%的项目能将渲染三角形面片数控制在100K以下。
2)ARPG游戏的场景复杂程度明显低于MMORPG游戏,渲染面片峰值要比MMORPG手游平均低50K。同时,虽然2016 Q4和2017 Q1渲染面片数量大幅上升,但2017 Q2开始回落趋势较为明显。
Graphics.Bilt操作平均每次调用的CPU耗时主要分布在: 0.1~8.5ms。该项CPU开销在低端设备上的上升趋势较为明显,但在2017 Q1大幅下降。这主要是因为,在2017 Q1后,ARPG项目普遍开启了多线程渲染功能。
2、UI模块
严重程度:地狱
使用NGUI作为UI解决方案的项目占据了较高的比例,但从趋势上来看,UGUI从2016 Q3开始,增速非常明显。通过进一步分析,我们发现近大半年来的新ARPG手游中,使用UGUI的项目显著增加,从而大幅提升了UGUI在ARPG项目中的使用占比。
下面我们将分别说明NGUI和UGUI的CPU耗时和堆内存占用情况。
UI模块的性能开销依然很高,也是我们统计中的第二大性能杀手。在中低端设备上,超过90%的研发项目在UI端都面临较为严重的性能问题,主要体现方面与MMORPG游戏类似,功能界面复杂、同一时刻需要更新的Panel多等。但ARPG的平均耗时要略低于MMORPG,这是因为ARPG主要仍以推图形式为主,其在战斗副本中的玩家是预先固定的,大量玩家同屏打怪的情况很少出现。
经统计,NGUI中堆内存每10000帧分配的主体范围为 6.0~81.7 MB,UGUI中堆内存每10000帧分配的主体范围在12.3 MB以内。从堆内存分配来看,UGUI远低于NGUI。
3、逻辑代码
严重程度:噩梦
1)GC触发频率很高,是造成卡顿的主要原因之一,目前只有12.5%的项目可以将GC的触发频率控制在1000帧/次以上。
2)在2017年GC平均耗时趋势虽有所上升,但相比于2016年已经大幅降低。
1)Instantiate实例化操作平均每次调用的CPU耗时主要分布在: 1.2~43.5 ms,且主要集中在10ms以内。
2)Instantiate实例化耗时在2017 Q2之后大幅下降,这说明越来越多的研发团队开始重视项目运行时的资源管理。
Shader.Parse 操作是比较突出的性能杀手,目前平均每次调用的CPU耗时主要分布在 4.4~145.2ms。但随着越来越多团队了解该项的耗时特性后,该项的CPU耗时呈现出较为明显的下降趋势。
4、动画模块
严重程度:噩梦
1)Animator.Update/Animation.Update的开销在中低端设备上的耗时普遍较高,但整体耗时在2017年上半年有明显的下降趋势。
2)ARPG游戏的MeshSkinning.Update的耗时明显高于MMORPG游戏。这主要体现在角色模型的面片数和骨骼数方面,ARPG更加偏向于动作表现力上。
5、粒子模块
严重程度:普通
1)粒子系统的CPU开销普遍较低,且近一年来下降趋势较为明显。
2)粒子系统的数量使用仍然较大,这样会造成较高的内存占用。UWA建议将粒子系统的使用数量峰值控制在400以下,目前仅21.8%的项目达到。
6、物理模块
严重程度:普通
物理模块的性能普遍较好,但呈现出较为明显的上升趋势,因此在中低端机上依然需要研发团队关注。
三、ARPG手游内存模块开销分析
内存泄露是研发过程中经常面临的严峻问题,依然有37%的项目存在不同程度的内存泄露。我们可以看到从2016 Q2开始,内存泄露占比大幅下降,但随着项目新功能的开发以及新项目的涌入,其占比又开始大幅攀升回来。虽然整体趋势有所下降,但内存泄露问题的有效防范和解决,依然任重道远。
1、总体内存
严重程度:地狱
1)总体内存峰值主要分布在95.6~573.9 MB区间,且均值在300MB以上。
2)与MMORPG游戏相比,ARPG内存占用的上线起伏更加明显。经过进一步分析,我们发现,2016 Q4的内存占用在大多数老项目中的主要资源(纹理、网格和动画片段等)都得到了较大的内存优化;但随着2017 Q1新项目不断涌入,内存占用又大幅回升;而2017 Q2内存的下降则是因为AssetBundle内存的大幅下降,大多数研发团队开始通过LoadFromFile来加载LZ4格式的AssetBundle,从而让内存又迅速回落。
2、总体堆内存
严重程度:地狱
1)总体堆内存峰值主要分布为 9.7~109.6 MB,仅37.7%的项目可以把总体堆内存峰值控制在40MB以内。
2)堆内存使用上升趋势明显,建议研发团队重点关注。对此,UWA建议重点关注以下几点:
- 严格关注配置文件的使用,避免一次性加载过大的配置文件而撑大堆内存;
- 不少项目的堆内存增大是由于热更新所致。因此,对于过大的数据Data的使用,建议通过分帧进行,并及时进行GC回收;
- 避免不必要的代码堆内存分配,虽然是老生常谈,但从趋势上可以看出,大多数研发团队仍需加强重视。
项目的内存占用很大一部分来自于资源的使用,下面我们将对项目中主流资源的使用情况进行分析。
3、纹理资源内存
严重程度:地狱
1)纹理内存峰值主要分布为 22.4~198.8 MB,且主要分布在50~100MB区间。
2)内存峰值占用在2016 Q4大幅下降,但在今年后又开始逐步上升,建议研发团队密切关注自身项目的纹理资源使用情况。
4、网格资源内存
严重程度:噩梦
1)网格资源内存峰值主要分布为 1.0~ 47.5 MB,且主要集中在40MB以内。
2)ARPG游戏的场景较之MMORPG游戏普遍较小,场景相对轻量和简单,因此,其网格资源量明显低于MMORPG游戏。
5、动画资源内存
严重程度:噩梦
动画资源内存峰值主要分布在38.7 MB以内,且主要集中在15MB以内。
6、Shader资源内存
严重程度:噩梦
1)Shader资源内存峰值主要分布在6.1 MB之内,且主要集中在1MB之内。
2)从内存趋势上来看,近一年来内存占用下降较为明显。
7、RenderTexture资源内存
严重程度:地狱
1)RenderTexture资源内存峰值主要控制在67.7 MB以内,且在各个区间都较为平均。
2)内存使用上升趋势明显,建议研发团队对其在自身项目中的使用情况特别关注!
8、粒子系统资源内存
严重程度:噩梦
1)粒子系统资源内存峰值主要分布在 33.7 MB以内,且主要集中在20MB以内。
2)粒子系统的内存占用一直较为平稳,虽然在2011年Q1期间高端机上的内存占用较高,但在2017年Q2则大幅回落到之前水平。
3)目前,粒子系统的内存占用仍然较为“虚高”,即游戏运行期间Active数量远小于内存中的总数量,在大部分项目中,Active的粒子系统数量占比不到10%,即粒子系统的内存占用峰值应该在5MB左右。
四、ARPG手游资源管理分析
1)在资源加载方面,AssetBundle.Load和Resources.Load是项目中的主要加载方式。
2)通过调用趋势可以看出,研发团队对于Resources.Load的使用仍然有明显的增长趋势。对此,UWA强烈建议研发团队尽可能使用AssetBundle作为游戏资源的主要加载方式。
1)LoadFromFile(Async)是ARPG项目中AssetBundle的主要加载方式。
2)LoadFromFile(Async)的使用在2017 Q2上大幅增长了46%,这是在UWA DAY 2017上我们非常建议的AssetBundle加载方式(Unity 5.3版本后),研发团队可以通过UWA Blog(blog.uwa4d.com)的相关文章查看具体的性能对比。
Instantiate/Destroy和Active/Deactive调用次数较高,需要研发团队根据自身项目情况时刻注意:
1)由于Active/Deactive每次调用的CPU开销不大,且不会造成崩溃、闪退等问题,所以研发团队极易忽视这两项操作所带来的性能问题,因而出现了游戏运行1万帧Active/Deactive上万次调用的情况。因此,此处存在着很大的性能浪费;
2)Instantiate/Destroy的调用次数同样较高,虽然不如Active/Deactive频繁,但每3帧调用1次Instantiate的频率依然不容忽视,建议研发团队坚持加强项目的资源管理,避免不必要的频繁Instantiate/Destroy操作发生。
五、UWA 对于ARPG手游研发团队的建议
一、警惕渲染模块和UI模块这两大性能杀手!随着精品化ARPG项目的日益增多,在日后很长一段时间内,这两项依然将是研发团队在性能优化方面的重中之重!
- 渲染方面,Draw Call的控制技术已被越来越多的团队所熟练掌握,并且随着设备的发展,Draw Call的影响将越来越小,反观渲染Triangle数量将逐步成为渲染模块的新的性能瓶颈,越来越大的渲染Triangle量会给GPU、耗电和发热方面带来巨大的压力;
- UI方面,UI网格重建开销在未来相当长的一段时间内仍然是研发团队头痛的问题,UI优化的原则非常简单:动静分离,但真实操作起来则是非常困难。90%项目中的UI性能问题是由于动静元素没有分离导致,但没有任何两个项目的具体原因是一致的。这是UI性能优化方面非常困难的主要原因。
二、逻辑代码方面,Instantiate实例化开销虽然在2017 Q2呈现较为明显的下降趋势,但仍需要研发团队持续对资源管理进行监控。同时,GC开销的上升趋势明显,需要研发团队加强对Mono堆内存的优化意识;
三、在内存优化方面,与MMORPG游戏类似,Mono和RenderTexture内存占用在2017年的上升趋势非常明显,对此,建议研发团队在接下来的项目研发中密切关注这两项的内存使用;
四、在动画模块方面,ARPG游戏的CPU耗时明显高于MMORPG游戏。对此,我们的建议如下:
- 尝试动画片段的精度缩减技术,该技术在UWA Blog和UWA问答上(answer.uwa4d.com)都有详细的讲解和代码分享;
- 由于ARPG游戏对于动作表现力的要求很高,因此,相比于Humanoid模式,Generic模式更加适合于ARPG项目,它可以让你的动画表现与3DMax、Maya等制作表现更加一致;
- 随着ARPG中怪物角色的数量持续增加,GPU Instancing技术会受到更多游戏团队的青睐,具体做法可参加UWA Blog相关文章。但同样需要注意的是,研发团队需要控制同屏的渲染面片数。
五、资源加载方面,Resources.Load依然是比较主流的资源加载方式。但UWA建议尽可能尝试通过AssetBundle.Load来加载相关资源。在2017 Q2以后,LoadFromFile(Async)已经成为ARPG研发团队的主流AssetBundle加载方式,对于仍然没有使用该方式的研发团队,建议查看UWA的相关直播信息,并找到对应的性能比较和分析;
六、以上数据是我们对于ARPG手游性能数据的整体研究和趋势分析,旨在从宏观上为大家展现项目中普遍存在的性能瓶颈和研发团队容易忽视的潜在性能问题。但同样需要说明的是,优化是一个“抽丝剥茧”的过程,需要研发团队花费大量的时间和耐心去完成。UWA建议:多做测试,以数据说话,空杯心态,将经验归零。
以上就是UWA发布的2016-2017年ARPG手游性能测评汇总和分析。此次,我们从性能参数上增加了资源加载、资源卸载等数据扩充了报告的完整性,在测评参数上加入了机型、历史数据等方便研发团队能及时进行横向和纵向的比较。我们深信数据是会说话的,总有规律值得我们追溯求实、鉴往知来。同时我们也会不断细化评析的标准、划分,以使得这些数据更有代表性和说服力。
原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。