《仙剑奇侠传3D回合》性能精讲

《仙剑奇侠传3D回合》性能精讲

今天我们为大家带来由北京盖娅互娱研发的《仙剑奇侠传3D回合》 的UWA测评分析。这是一款我们深度优化的3D手游,其在中低端设备上的性能表现非常优异。在此,我们对该游戏的性能数据进行深度剖析,希望大家对手游各个模块的运行效率有更为深刻的理解。

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

该游戏目前已经开启精英测试,感兴趣的朋友可以通过 https://xjqxz.gaeamobile.net/index 一睹为快,同时也将于近期正式登陆iOS平台!


CPU性能

该游戏在CPU占用方面的性能非常不错,下图为该游戏在红米Note2设备上按照剧情进行游戏时的性能数据。可以看出,在红米Note2上运行的25177帧中,超过33ms的帧数占比为9.0%,超过50ms的帧数占比为3.1%。考虑到切换场景时资源加载的开销,一款游戏如果超过33ms的帧数占比低于10%,则说明该游戏的性能非常出色,绝大部分时刻运行也会非常流畅。
请输入图片描述
其整体CPU性能的优秀表现与其各个模块的合理使用是分不开的。下面,我们就详细讲解一下其CPU性能方面的亮点。

1. 渲染模块
通过UWA性能测评报告,我们可以看到该游戏详尽的渲染模块性能开销。该游戏在红米Note2设备上运行时的渲染模块CPU开销如下图所示。通过统计,半透明物体渲染的CPU消耗均值为 3.4 ms,主要集中在 1.0~7.4ms 范围内(5%~95%)。不透明物体渲染的CPU消耗均值为 2.8 ms,主要集中在 1.1~6.4ms范围内(5%~95%)。Draw Call峰值为 791,且主要集中在 48~254 范围内(5%~95%)。

需要说明的是,Draw Call峰值 和 Triangle峰值 并不是判断项目存在渲染性能问题的唯一标准。建议开发团队将峰值和主要范围(5%~95%)结合起来进行判断。
请输入图片描述

Draw Call使用略高,从图中可以看出,Draw Call峰值出现在场景切换处,然后迅速降低到200左右,这是因为场景的资源在动态加载后通过StaticBatchingUtility API来手动进行合并。这是一个较为好用的降低Draw Call的方法,特别适用于对于动态加载资源、灵活拼合Mesh的项目需求。

在游戏运行过程中,我们也会偶尔看到Draw Call达到400以上,通过定位,这些Draw Call的升高均是因为剧情需要,或平视镜头进行NPC对话,或“御剑飞行”从更高的角度来俯瞰场景。对于这种情况,我们建议可以通过Culling Distance去除一些场景中的小物件(花草)或者较为耗时的物件(粒子特效)等,从而来降低因渲染场景变大而带来的额外开销。
请输入图片描述

2. 物理模块
在UWA测评报告中,该游戏运行时的物理模块CPU开销如下图所示。可以看出,Physics.Simulate的CPU占用主要集中在1ms以下,该值处于合理范围之内(一般建议在3ms以下)。
请输入图片描述

该模块的优秀效率取决于项目对碰撞对Contacts数量的控制,从下图可以看出,在游戏运行过程中,Contacts数量的峰值仅为1。同时,Active Rigidbody的数量峰值为1,碰撞体的数量峰值低于40,均处于合理范围之内。对此,建议大家时刻关注UWA测评报告中Contacts数量、Rigidbody和碰撞体数量的变化,通过对应的项目截图来判定数量高值处是否合理。
请输入图片描述
请输入图片描述
请输入图片描述

3. 动画模块
在UWA测评报告中,该游戏运行时的动画模块CPU开销如下图所示,目前该项目使用的是Mecanim动画系统。通过统计,Animator.Update总体的CPU占用均值为1.2 ms,主要集中在0.5~2.4ms范围内(5%~95%),该值处于合理范围之内(一般建议在3ms以下)。
请输入图片描述

重要提示:动画模块的优化主要有以下几点需要注意

1.对蒙皮网格在尽可能保证视觉效果的前提下进行简化,可以通过SimpleLOD等插件来快速查看简化效果;

2.除对蒙皮网格进行控制外,UWA仍强烈建议大家尽可能开启“Optimize GameObject”这一选项,它将进一步提升项目的动画模块效率;

3.控制场景中具有Animator Controller组件的GameObject,建议通过调整其Culling选项来降低视域体或一定范围外的动画组件更新。

4. UI模块
该游戏在红米Note2设备上运行时的UI模块CPU开销如下图所示。该游戏使用UGUI作为UI界面的解决方案。经过统计,UI模块总体的CPU占用均值为1.1 ms,主要集中在0.1~3.2ms范围内(5%~95%)。
请输入图片描述

目前,大量项目的UI模块CPU占用均很高。我们看到的UI模块开销,经常是如下图一般的高开销、高占用:

请输入图片描述

对于UGUI的性能优化,我们建议你时刻注意以下几点:

1.尽可能将静态UI元素和动态UI元素分开,存放于不同的Canvas下。同时,对于不同频率的动态元素也建议存放于不同的Canvas中;

2.严格控制一个非静态的Canvas(即Canvas中会有元素发生变化)中的UI元素数量,因为Canvas中所有的UI元素都会合并到一个Mesh中,一旦某个元素发生变化,则会引起Mesh发生变化,从而造成开销;

3.尽可能减少Mask组件的使用,不仅提高绘制的开销,同时会造成Draw Call明显上升。


内存模块

《仙剑奇侠传3D回合》在内存上的表现如下图所示。总内存峰值达到241MB,Mono堆内存峰值为36.3MB,且内存在游戏运行过程中表现较为平稳。241MB的总内存分配相对来说略高,研发团队可尝试在低端机器上对资源进行进一步控制,从而降低低端机器上的内存占用。
请输入图片描述

1. Mono堆内存
从上图可知,该游戏的总体Mono堆内存控制得很好,在29075帧中,Mono的堆内存峰值仅为 36.3MB。该值属于合理范围之内(<40MB)。同时,该游戏运行时触发GC的频率很低,为968帧/次。
请输入图片描述

如此低频的GC触发和少量的Mono堆内存分配,主要得益于项目的函数堆内存分配控制得非常少,下图为当前游戏运行25000+帧的函数堆内存分配情况。因此,建议大家对函数代码堆内存的分配进行严格控制,对于堆内存分配较高(10000帧10MB+)的函数进行详细定位其分配原因。在UWA测评报告中,我们也提供了堆内存分配Top10的具体堆栈,以方便大家尽快地定位堆内存分配出处。

请输入图片描述

2. 资源内存
经过统计,该游戏的纹理资源数量峰值为343个,内存占用峰值40.4MB。在全部纹理资源中,ETC1格式纹理占有179个,Alpha8格式纹理占有133个,RGBA32、ARGB32和RGB24格式纹理共占有20个,ETC2格式纹理有2个,其余为RGBA16格式纹理。
请输入图片描述
对于RGBA32、ARGB32和RGBA16格式的纹理,我们建议在视觉效果可以保证的情况下,尽可能使用ETC1格式纹理(Android平台)进行替换,不仅可以达到更小的内存占用,同时可以获得更快的加载效率。对于纹理资源的加载效率,我们在之前的加载模块性能—纹理篇中进行了详细的分析和阐述,建议大家进一步查看,进一步加深加载模块的掌控能力。

其他资源的内存占用情况如下:
Mesh资源:
请输入图片描述

AnimationClip资源:

请输入图片描述
AudioClip资源:

请输入图片描述
目前,该游戏运行过程中仍然能检测到少量的“疑似”冗余资源。下图分别为纹理资源、动画资源和Shader资源的冗余情况。就我们目前深度优化过的项目来看,资源冗余往往是AssetBundle的冗余打包所致。对此,如果你的项目也在使用AssetBundle来加载资源,建议将AssetBundle文件提交到UWA资源检测工具中,可以快速定位和修复AssetBundle文件中资源的冗余问题。
请输入图片描述
以上则为《仙剑奇侠传3D回合》游戏在CPU性能和内存管理方面的具体使用情况。优秀的CPU性能、低频的GC调用、较低的堆内存分配和合理的资源使用,足以说明该研发团队具备非常深厚的技术功底和对于引擎相当优秀的把控能力。

最后,非常感谢《仙剑奇侠传3D回合》研发团队对 UWA 的认可和支持。感谢他们乐于将项目性能数据与大家一起分享,让更多的研发团队了解到一款性能优秀的3D移动游戏在各个模块上可以做到怎样的程度。同时,也欢迎更多的开发团队可以与我们一起来分享你们的性能数据,让更多的游戏开发者受益!