MMORPG游戏优化报告
作者:互联网
一、MMORPG手游总体性能开销分析
二、MMORPG手游CPU模块性能开销分析
三、MMORPG手游内存模块性能开销分析
四、MMORPG手游资源管理分析
五、UWA对于MMORPG手游研发团队的建议
一、MMORPG手游总体性能开销分析
iOS设备的CPU性能普遍高于Android设备,Android设备的CPU均值主体范围为14.4~73.6 ms,iOS设备的CPU均值主体范围为9.2~43.5 ms。在Android设备上,CPU耗时集中在17~50ms区间,而在iOS设备上,CPU耗时集中在33ms以内。
我们选择了测评次数最多的四款机型来进行统计,这四款机型分别是红米2、红米Note2、华为6Plus和三星S6。
1)大部分MMORPG手游在中低端设备的性能开销较高,大于33ms的耗时占比范围在60%~70%。
2)精品化过程中的MMORPG手游在低端移动设备上的CPU开销明显增大。相较2016年同期,2017 Q2 MMORPG手游的CPU开销均值增长超过50%。
无论是高、中、低端的Android设备,渲染、UI、加载/代码都是需要研发团队重点关注的,它们的消耗总和占了总开销的80%。
下面我们就来具体分析这些主流模块的开销情况。
二、MMORPG手游CPU模块性能开销分析
1. 渲染模块
严重程度:地狱
为了能够更好地反映出各个性能参数的整体使用情况,我们统计了每种性能参数的主体使用范围,其范围区间是[5%~95%],以下数据中P5代表5%,P95代表95%。
MMORPG手游的Draw Call数量普遍较高,且设备性能越好,数量峰值越高。这主要有以下几方面原因:
1)研发团队普遍开始针对不同机型来制定自适应的渲染LOD策略,主要包括模型LOD和Shader LOD等。
2)除LOD外,研发团队同样会对一些渲染效果进行有针对性的设置,最常见的是阴影的处理,高端机上开启实时阴影,而低端机上则通过较为简单的阴影面片或Projector来处理。另外,水体模拟也越来越多地在项目中被使用,高端设备上开启水面反射效果,也会增加一定量的Draw Call。
但就目前数据表明,研发团队已经开始有意地对Draw Call进行控制,UWA建议Draw Call占用的P95 < 200,72.3%的项目可以将其控制在这个范围内。
1)MMORPG手游的场景渲染三角形面片数量普遍较高。且设备性能越高,数量峰值越高。经过统计,在中低端设备中,40.4%的项目能将渲染三角形面片数控制在100K以下。
2)场景复杂程度明显增加,虽然2017 Q2数量有所回落,但相较于去年同期,仍然增幅33%。同时,较高的渲染面片数量也大幅增加了中低端设备的GPU渲染压力和耗能压力。
Graphics.Bilt操作平均每次调用的CPU耗时主要分布在: 0.1~5.1ms。与Instantiate开销类似,该项CPU开销在低端设备上的上升趋势较为明显,但在2017 Q2大幅下降。这主要是因为,在2017 Q1后,MMORPG项目普遍开启了多线程渲染功能。
2. UI模块
严重程度:地狱
使用NGUI作为UI解决方案的项目占据了相当高的比例,NGUI目前仍然是MMORPG研发团队对于UI系统使用的主要解决方案。MMORPG是目前手游中工程技术难度最为复杂的游戏品类之一,对于UI模块的选择,大多数团队仍然倾向于从稳定性和把控性两方面出发,这也是NGUI占比持续较高的主要原因。
下面我们将分别说明NGUI和UGUI的CPU耗时和堆内存占用情况。
UI模块的性能开销依然很高,也是我们统计中的第二大性能杀手。在中低端设备上,超过90%的研发项目在UI端都面临较为严重的性能问题,主要体现在以下几个方面:
(1)MMORPG游戏的界面复杂,功能多(技能、背包、角色、任务、商城等),数量大(血条、名称、飘字等HUD)。
(2)同一时刻存在大量需要更新的Panel,比如,移动中血条等HUD、NPC不断更新的提示icon、面板中(任务、首充等)的提醒动画、聊天框和弹幕中随机出现的滚动文字等。
以上情况都是MMORPG项目研发团队每天面对的主要UI问题,可能一个Widget的使用疏忽,就能让研发团队的UI模块性能开销飙升一个量级。
注意:从重要函数上来看,UGUI的CPU占用大幅低于NGUI。需要说明的是,Unity 5.2版本之后已经开始将UI的部分计算操作移到子线程中进行,而主线程中的表现则为WaitingForJob、PutGeometryJobFence等,在本次报告中,我们并没有将这两项开销统计在内。
经统计,NGUI中堆内存每10000帧分配的主体范围为 6.1~103.3 MB,UGUI中堆内存每10000帧分配的主体范围在10.9 MB以内。从堆内存分配来看,UGUI远低于NGUI。
3. 逻辑代码
严重程度:噩梦
1)GC触发频率很高,是造成卡顿的主要原因之一,目前只有10%的项目可以将GC的触发频率控制在1000帧/次以上。
2)随着MMORPG游戏越来越重度化,GC平均耗时在逐步上升。GC耗时会逐渐成为游戏运行时的主流性能杀手,需要研发团队时刻注意!
1)Instantiate实例化操作平均每次调用的CPU耗时主要分布在: 1.4~33.1 ms,且主要集中在10ms以内。
2)Instantiate实例化耗时在2017 Q2之前一直处于上升趋势,但在2017 Q2中大幅下降,这说明越来越多的研发团队开始重视项目运行时的资源管理。
Shader.Parse 操作是比较突出的性能杀手,目前平均每次调用的CPU耗时主要分布在 5.8~134.4ms。但随着越来越多团队了解该项的耗时特性后,该项的CPU耗时呈现出较为明显的下降趋势。
4. 动画模块
严重程度:噩梦
1)Animator.Update/Animation.Update的开销在中低端设备上的耗时普遍较高,但整体耗时在2017年上半年明显降低。
2)MeshSkinning.Update的耗时普遍较低。
5. 粒子模块
严重程度:普通
1)粒子系统的CPU开销普遍较低,且近一年来下降趋势较为明显。
2)粒子系统的数量使用仍然较大,这样会造成较高的内存占用。UWA建议将粒子系统的使用数量峰值控制在400以下,目前仅24.8%的项目达到。
6. 物理模块
严重程度:普通
物理模块的性能普遍较好,但呈现出较为明显的上升趋势,因此在中低端机上依然需要研发团队关注。
三、MMORPG手游内存模块开销分析
内存泄露是研发过程中经常面临的严峻问题,依然有将近半数的项目存在不同程度的内存泄露。但我们可以看到,内存泄露的比例正在逐步降低,相较于去年同期,2017 Q2的内存泄露占比已经下降了6%。
总体内存
严重程度:地狱
1)总体内存峰值主要分布在146.8~576.9 MB区间,且均值在350MB以上;
2)随着MMORPG游戏的精品化趋势,其内存占用也逐步增加,虽然2016 Q4稍有回落,但整体内存的上升趋势较为明显。
总体堆内存
严重程度:地狱
1)总体堆内存峰值主要分布为 18.3~117.2 MB,仅34.2%的项目可以把总体堆内存峰值控制在40MB以内;
2)堆内存使用上升趋势明显,建议研发团队重点关注。对此,UWA建议重点关注以下几点:
(1)严格关注配置文件的使用,避免一次性加载过大的配置文件而撑大堆内存;
(2)不少项目的堆内存增大是由于热更新所致。因此,对于过大的数据Data的使用,建议通过分帧进行,并及时进行GC回收;
(3)避免不必要的代码堆内存分配,虽然是老生常谈,但从趋势上可以看出,大多数研发团队仍需加强重视。
项目的内存占用很大一部分来自于资源的使用,下面我们将对项目中主流资源的使用情况进行分析。
1. 纹理资源内存
严重程度:地狱
1)纹理内存峰值主要分布为 27.8~174.6 MB,且主要分布在50~100MB区间。
2)内存峰值占用在2016 Q4大幅下降,但在今年后又开始逐步上升,建议研发团队密切关注自身项目的纹理资源使用情况。
2. 网格资源内存
严重程度:噩梦
1)网格资源内存峰值主要分布为 8.5~ 70.4 MB,且主要集中在40MB以内;
2)MMORPG游戏的场景普遍较大、角色普遍较多,因此,其网格资源量明显高于其他类型游戏。但从使用趋势上来看,其最近一年的使用趋势较为平稳,均值均在30MB上下浮动。
1)动画资源内存峰值主要分布在: 3.5~ 58 MB,且主要集中在15MB以内。
2)内存使用趋势较为平稳,平均峰值内存长期控制在20~25MB区间之内。
3. Shader资源内存
严重程度:噩梦
1)Shader资源内存峰值主要分布为 0.1~ 5.6 MB,且主要集中在1MB之内。
2)从内存趋势上来看,2016年内存占用下降较为明显,2017年略有上升。
4. RenderTexture资源内存
严重程度:地狱
1)RenderTexture资源内存峰值主要分布为 0.1~ 100.9 MB,且在各个区间都较为平均;
2)内存使用上升趋势明显,建议研发团队对其在自身项目中的使用情况特别关注!
5. 粒子系统资源内存
严重程度:噩梦
1)粒子系统资源内存峰值主要分布为 1.3~ 34.8 MB,且主要集中在20MB以内。
2)粒子系统的内存占用在2016年Q3期间较高,而后在2016年Q4大幅下降,但仍然还有较大的下降空间。目前,粒子系统的内存占用较为“虚高”,即游戏运行期间Active数量远小于内存中的总数量,在大部分项目中,Active的粒子系统数量占比不到10%,即粒子系统的内存占用峰值应该在5MB左右。
四、MMORPG手游资源管理分析
1)在资源加载方面,AssetBundle.Load和Resource.Load是项目中的主要加载方式;
2)通过调用趋势可以看出,研发团队对于Resources.Load的使用仍然有增加的趋势。对此,UWA强烈建议研发团队尽可能使用AssetBundle作为游戏资源的主要加载方式。
1)LoadFromFile和New WWW是项目中AssetBundle的主要加载方式;
2)LoadFromFile的使用在2017 Q2上升了6%,这是在UWA DAY 2017上我们非常建议的AssetBundle加载方式(Unity 5.3版本后),研发团队可以通过UWA Blog的相关文章查看具体的性能对比。
Instantiate/Destory和Active/Deactive调用次数较高,需要研发团队根据自身项目情况时刻注意:
1)由于Active/Deactive每次调用的CPU开销不大,且不会造成崩溃、闪退等问题,所以研发团队极易忽视这两项操作所带来的性能问题,因而出现了游戏运行1万帧Active/Deactive上万次调用的情况。因此,此处存在着很大的性能浪费;
2)Instantiate/Destory的调用次数同样较高,虽然不如Active/Deactive频繁,但每5帧调用1次Instantiate的频率依然不容忽视,建议研发团队坚持加强项目的资源管理,避免不必要的频繁Instantiate/Destory操作发生。
五、UWA 对于MMORPG手游研发团队的建议
第一,警惕渲染模块和UI模块这两大性能杀手!随着精品化MMORPG项目的日益增多,这两项在接下来很长一段时间内依然是研发团队在性能优化时的重中之重!
- 渲染方面,Draw Call的优化技巧已被越来越多的团队所熟练掌握,并且随着设备的发展,Draw Call的影响将越来越小,反观渲染Triangle数量将逐步成为渲染模块新的性能瓶颈,越来越大的渲染Triangle量会给GPU、耗电和发热等带来巨大的压力;
- UI方面,UI网格重建开销在未来相当长的一段时间内仍然是研发团队头痛的问题,目前手游MMORPG仍然处于“端游手游化”的转变初期阶段,大多数研发团队考虑更多的仍是功能上的迁移和与移动端的结合,在UI技术上的沉淀较为薄弱。
第二,逻辑代码方面,Instantiate实例化开销虽然在2017 Q2呈现较为明显的下降趋势,但仍需要研发团队持续对资源管理进行监控。同时,GC开销上升趋势明显,需要研发团队加强对Mono堆内存的优化意识;
第三,内存泄露占比持续下降,但内存占用持续升高。虽然移动设备的内存量逐年增大,但对于希望覆盖面广阔的游戏团队来说,内存的控制仍然刻不容缓;
第四,在内存优化方面,大部分研发团队都将精力放在纹理、网格和动画片段等主要资源上,但通过上述分析发现,Mono堆内存和RenderTexture内存占用在2017年的上升趋势非常明显,对此,建议研发团队在接下来的研发中密切关注这两项的内存使用;
第五,动画资源和粒子系统的内存优化空间依然很大。对于前者,建议研发团队关注以下技术:
- 动画片段的精度缩减技术,该技术在UWA Blog和UWA问答上都有详细的讲解和代码分享;
- 关注Retargeting技术,该技术可以大幅降低多角色的动画片段内存占用,预测随着MMORPG项目的进一步重度化,该技术会得到越来越多团队的青睐。
对于后者,则建议研发团队关注粒子系统的资源配表,结合UWA线上性能报告,对不常使用的Particle System进行合理规划。
六、资源加载方面,New WWW、Resources.Load依然是研发团队非常常用的资源加载方式。但UWA建议尽可能尝试通过LoadFromFile(Async)和AssetBundle.Load来加载相关资源,从而获得更好的性能。研发团队可在UWA Day 2017的相关Blog中找到对应的性能比较和分析;
七、以上数据是我们对于MMORPG手游性能数据的整体研究和趋势分析,旨在从宏观上为大家展现项目中普遍存在的性能瓶颈和研发团队容易忽视的潜在性能问题。但同样需要说明的是,优化是一个“抽丝剥茧”的过程,需要研发团队花费大量的时间和耐心去完成。UWA建议:多做测试,以数据说话,空杯心态,将经验归零。
标签:手游,游戏,研发,内存,MMORPG,团队,优化,CPU 来源: https://blog.csdn.net/mango9126/article/details/114138041