《全民枪战》测评精讲
原文链接:http://blog.uwa4d.com/archives/Gunfight.html
今天我们为大家带来电竞手游《全民枪战》的测评报告分析,在我们测评过的大量项目中,《全民枪战》是一款性能相当优秀的移动FPS游戏。在此,我们将对该款游戏的性能数据进行深度剖析,希望通过这篇文章可以让大家对移动游戏的运行性能有更为深刻的认知,并对大家的项目研发有所帮助。
CPU性能
该游戏在CPU占用方面的性能非常不错,下图为该游戏在红米2和小米4上的CPU占用情况。在报告中,在红米2上运行的15647帧中,超过33ms的帧数占比为13.1%,在小米4上运行的19469帧中,超过33ms的帧数占比为9.6%。
红米2:
小米4:
其整体CPU性能的优秀表现与其各个模块的合理使用是分不开的。下面,我们就详细讲解一下其CPU性能方面的亮点之处。
渲染模块
该游戏在红米2设备上运行时的渲染模块CPU开销如下图所示。通过统计,半透明物体渲染的CPU消耗均值为2.9 ms,主要集中在1.3~5.9ms范围内(5%~95%)。不透明物体渲染的CPU消耗均值为4.4ms,主要集中在0.4~10.5ms范围内(5%~95%)。Draw Call峰值为178,且主要集中在18~131范围内(5%~95%),该值处于合理范围之内。
从图中可以看出,在战斗副本中,不透明物体的渲染为渲染模块的主要开销,且它与Draw Call和蒙皮网格数量基本上成正比趋势。这说明副本中渲染模块的CPU开销主要由蒙皮网格的渲染性能决定。蒙皮网格的优化将会为性能带来最大的产出比。
UI模块
该游戏在红米2设备上运行时的UI模块CPU开销如下图所示。通过统计,UI模块总体的CPU占用峰值为358.2 ms,均值为1.7 ms,主要集中在0.6~3.8ms范围内(5%~95%),该值处于合理范围之内。同时,在测试过程中总体堆内存分配量为9.0 MB,均值为0.6 KB/帧。
该游戏UI模块的性能开销很低,在15000+帧的运行过程中,堆内存仅分配9MB。这说明UI界面在制作和使用上均非常合理,其UI操作并没有频繁引起UIDrawCall变化,进而Mesh重建的出现几率很低。
内存模块
《全民枪战》在内存上的表现同样突出,如下图所示。总内存峰值为193MB,Mono堆内存峰值为22MB,且内存的升降非常一致,内存泄露的概率很低。
Mono堆内存
从上图可知,该游戏的总体Mono堆内存控制得很好,在15647帧中,Mono的堆内存峰值仅为22MB。这得益于其代码中严格避免了不必要的堆内存分配,下图为该游戏在15647帧中函数堆内存分配情况。
资源内存
该项目的资源内存占用很低,下图为纹理资源的内存占用情况。经过统计,纹理资源数量峰值为331个,内存占用峰值40MB,这说明纹理资源在分辨率、格式和Mipmap使用方面均非常合理。在全部纹理资源中,ETC1格式纹理占有269个,RGB24格式纹理仅有1个,ARGB32和RGBA32格式资源数为0。
其他资源的内存占用情况如下:
(1)Mesh
(2)AnimationClip
(3) AudioClip
以上为《全民枪战》游戏在CPU性能和内存管理方面的具体使用情况。虽然总体内存占用稍高,但优秀的CPU性能、较低的堆内存分配和合理的资源使用,足以说明该研发团队具备非常深厚的技术功底和对于引擎相当优秀的把控能力。
同时,该游戏在资源加载和实例化方面仍有一定的提升空间。在此,我们对其进行罗列,希望同样可以帮助到大家的研发项目。
性能优化、进无止境
Instantiate实例化
目前,游戏的战斗副本中Instantiate实例化的频率较高,如下图所示。较高频次的Instantiate/Destroy操作会造成一定的内存碎片,从而造成GC的加速到来。目前,游戏在小米4上运行19000+帧时,共检测到GC调用28次,平均690帧/次。
同时,通过更加细致的分析,可以看到Instantiate实例化的较大CPU开销均发生在背包界面打开时,如下图所示:
对于UI界面的实例化开销,我们一般建议如下:
● 对于使用频率不高但却较为耗时的UI界面,可通过Active/Deactive来进行切换;
● 对于使用频率较高的UI界面,则可通过直接改变Transform的方式来移进移出相机视域体,可以得到更加高效的性能。
Shader解析
在场景切换时,Shader的解析存在一定的CPU占用,如下图所示。可以看出,Shader的解析开销均在150ms之内,而这是可以避免的。对于一款移动游戏来说,Shader的使用数量大致在50个以内,且Shader的内存占用其实相当小,因此,可将Shader单独制作成一个AssetBundle,并通过依赖关系打包,让其他资源与其进行依赖。在游戏一开始启动时,即可加载该Shader的AssetBundle文件,对其进行解析并常驻内存。这样,后续再切换场景时,Shader将不再进行解析,这部分CPU开销自然可以省掉了。
动画资源冗余
在测评过程中,我们发现该项目的动画资源在使用上存在一定的冗余现象。如下图所示,图中红框内的数量峰值即表示该资源在测试过程中存在不同程度的冗余情况。点击资源,图表中即可显示该资源在项目测试阶段的具体使用情况,从而大家可以直接通过该曲线来定位资源出现冗余时的具体位置。
以上则为该项目在后续研发中可进一步提升性能的主要方面。在我们测评过的项目中,实例化频率过大,Shader重复解析、资源冗余等问题也是绝大多数研发团队遇到的共性问题。希望以上的讲解对大家的相关问题有所帮助。
最后,非常感谢《全民枪战》研发团队对UWA的认可和支持。感谢他们乐于将项目性能数据与大家一起分享,让更多的研发团队了解到一款性能优秀的移动FPS游戏在渲染、UI和内存等方面应该做到怎样的程度。同时,也希望更多的开发团队可以与我们一起来分享他们的性能数据,让更多的游戏开发者受益!