《艾尔战记》性能精讲

简介:

CPU性能

该游戏在CPU占用方面的性能较为不错,下图为该游戏在 小米4三星S6 上的CPU占用情况,可以看出,在小米4上运行的14920帧中,超过33ms的帧数占比为23.8%,超过50ms的帧数占比为8.6%;在三星S6上运行的20982帧中,超过33ms的帧数占比为5.7%,超过50ms的帧数占比为2.6%。

小米4:
UWA Tech Doc

三星S6:
UWA Tech Doc

下面,我们就详细讲解一下该游戏的各个模块在CPU性能方面的具体表现情况。

1. 渲染模块
该游戏在小米4设备上运行时的渲染模块CPU开销如下图所示。通过统计,半透明物体渲染的CPU消耗均值为 6.0 ms,主要集中在 2.2~11.6ms 范围内(5%~95%)。不透明物体渲染的CPU消耗均值为 4.6 ms,主要集中在 0.3~8.0ms 范围内(5%~95%)。Draw Call峰值为 222,且主要集中在 36~153 范围内(5%~95%),该值处于合理范围之内。

UWA Tech Doc

从上述分析可以看出,该游戏在类似小米4这样的中端设备上很好地控制渲染模块的性能开销。对此,我们进行了进一步分析,如果该游戏可以在以下几点进一步优化,那么将会达到更棒的运行性能。

(1)蒙皮网格渲染
通过测评报告进行分析,我们发现蒙皮网格数量与Draw Call、Triangles和不透物体渲染耗时的走势较为一致,如下图红框中所示。这说明蒙皮网格的渲染开销占据了不透明物体渲染的绝大部分耗时。同时,可以看出,战斗副本中当蒙皮网格有变化时,Draw Call和Triangle并存在明显变化,如蓝框所示,这说明副本中的所用的蒙皮网格所包含的面片数较少,蒙皮网格数量与Draw Call增加数量几乎为1:1。而红框为主场景中,蒙皮网格与Draw Call和Triangle之间的关系。可以看出,虽然蒙皮网格的变化极大地影响了后两者的变化,且蒙皮网格数量与Draw Call在1:5~1:10之间。我们推测这其中的变化是由角色、NPC等造成的,且每个角色均具有较多的面片数和SubMesh(换装)数量。
UWA Tech Doc

同时,我们进一步研究了蒙皮网格渲染在小米4设备上CPU端的具体开销。下图中紫色线条表示不透明蒙皮网格的渲染开销,黄色线条表透明蒙皮网格的渲染开销。从而可以看出,场景中蒙皮网格大多为不透明材质模型,且CPU占用较高。

UWA Tech Doc

那么,到底是哪些蒙皮网格导致了较高的CPU占用呢?为此,我们在 具体资源信息 中查找相关的蒙皮网格,其中 含有三角形面片数量Top10 的蒙皮网格使用情况如下表所示。对此,我们建议研发团队可以进一步对三角面片较多的蒙皮网格进行进一步的简化。

UWA Tech Doc

相信不少团队也遇到了蒙皮网格面片数较高的情况。对此,我们建议如下:

对于网格简化,可以尝试使用Asset Store中的SimpleLOD插件;
对于降低蒙皮网格的Draw Call,可以尝试使用Asset Store中的MeshBaker插件。

(2)粒子系统渲染
粒子系统的渲染同样占据了较高的性能开销,下图为红米2设备上粒子系统渲染在CPU端的占用情况。
UWA Tech Doc
对于这种情况,我们的建议如下:

在低端设备上尽可能降低粒子系统的复杂程度,可对粒子系统根据设备的档次来进行分级,从而降低中低端设备上的开销;
对于5.x项目,可尝试升级到5.3以后版本,因为Unity在5.3版本后对粒子系统底层进行了深入的优化。

2. 物理模块
该游戏在小米4设备上运行时的物理模块CPU开销如下图所示。通过统计,物理模块总体的CPU占用均值为0.2 ms,主要集中在0.1~0.3ms范围内(5%~95%),该值处于合理范围之内(一般建议在3ms以下)。

UWA Tech Doc

物理模块的低效能开销主要得益于Contacts和Rigidbody数量控制得当。在《艾尔战记》游戏中,Rigidbody和Contacts数量一直为0,即说明游戏中并未用到任何物理碰撞,同时也说明研发团队对Physics Matrix进行了相当合理的设置,避免不必要的碰撞检测发生。

UWA Tech Doc
UWA Tech Doc

重要提示:不少项目中,Contacts数量较高的原因是由于UI的不当使用造成的,即UI widgets摆在同一深度并存在相互叠加的情况,从而形成了较多不必要的Contacts,进而造成了不必要的物理碰撞开销。建议大家通过UWA对物理模块中Contacts的数量进行详细地检测。

3. 动画模块
该游戏在小米4设备上运行时的动画模块CPU开销如下图所示。通过统计, 蒙皮网格每帧Update更新的CPU占用均值为1.7 ms,主要集中在0.1~2.7ms范围内(5%~95%),该值处于合理范围之内(一般建议在3ms以下)。
UWA Tech Doc

重要提示:对于使用Mecanim动画系统的团队来说,建议尽量开启动画系统的“Optimize GameObject”选项,从而来得到更为高效的动画性能。


内存模块

《艾尔战记》在内存上的表现非常优异,如下图所示。总内存峰值为188MB,且绝大部分时间保持在165MB以下。Mono堆内存峰值为32.1MB,且内存的升降较为一致。
UWA Tech Doc

1. Mono堆内存
从下图可知,该游戏的总体Mono堆内存控制得很好,在14920帧中,Mono的堆内存峰值仅为 32.1MB。该值属于合理范围之内(<40MB)。

UWA Tech Doc

2. 资源内存
经过统计,该游戏的纹理资源数量峰值为324个,内存占用峰值63.3MB。在全部纹理资源中,ETC1格式纹理占有175个,ARGB32和RGBA32格式资源数共有99个,其余为RGBA16格式。

UWA Tech Doc
项目中ARGB32和RGBA32格式的纹理数量较多,我们建议在视觉效果可以保证的情况下,尽可能使用ETC1格式纹理进行替换,从而达到更小的内存占用。

3. 其他资源的内存占用情况如下:
Mesh资源:
UWA Tech Doc

AnimationClip资源:
UWA Tech Doc

AudioClip资源:
UWA Tech Doc

以上则为《艾尔战记》游戏在CPU性能和内存管理方面的具体使用情况。优秀的CPU性能、较低的内存分配,足以说明该研发团队具备非常深厚的技术功底和对于引擎相当优秀的把控能力。

同时,该游戏在资源加载和实例化方面仍有一定的提升空间。在此,我们对其进行罗列,希望同样可以帮助到大家的研发项目。


性能优化、进无止境

1. Instantiate实例化
目前,游戏的战斗副本中Instantiate实例化的频率较高,如下图所示。较高频次的Instantiate/Destroy操作会造成一定的内存碎片,从而造成GC的加速到来。
UWA Tech Doc

我们对游戏的Instantiate调用进行进一步分析,下图则为Instantiate的具体分配情况。通过此图,Instantiate的调用位置、具体耗时、频率等,大家一目了然!
UWA Tech Doc
对于频繁的Instantiate调用,我们一般建议如下:

对于一般的GameObject(比如技能特效、怪物角色等),可将其放入缓存池并通过Active/Deactive来进行切换;
对于使用频率较高的UI界面,则可通过直接改变Transform的方式来移进移出相机视域体,可以得到更加高效的性能。

2. GC调用
在测试过程中,GC的调用频率较高。游戏在小米4上运行14000+帧时,共检测到GC调用45次,平均331帧/次。

UWA Tech Doc
GC的调用频率主要由代码的堆内存分配情况相关。下图则为该游戏运行过程中,堆内存分配Top10的函数列表。正是这些函数分配的大量堆内存,才造成了较高频次的GC调用。
UWA Tech Doc

注意:建议大家一定要多关注代码的累积堆内存分配情况,因为它基本上决定了GC的调用频率。如果你的代码中存在分配10MB以上堆内存的函数,切记一定要详细检测,检测其堆内存分配是否合理。

3. 动画资源冗余
在测试过程中,我们发现该项目的动画资源在使用上存在一定的冗余现象,如下图所示。图中红框内的数量峰值即表示该资源在测试过程中存在不同程度的冗余情况。点击资源,图表中即可显示该资源在项目测试阶段的具体使用情况,从而大家可以直接通过该曲线来定位资源出现冗余时的具体位置。
UWA Tech Doc

注意:一般情况下,这种情况是由AssetBundle没有进行完全依赖性打包所致。当你的项目出现资源冗余情况时,建议对AssetBundle的打包机制进行进一步的梳理,定位问题并完善相关的资源打包步骤。在此,我们建议开发者在UWA上进行资源检测,该工具能高效地协助解决资源依赖性打包和冗余的问题。

4. 粒子系统
在测试过程中,粒子系统的更新在中低端设备上占有较高的CPU开销。下图为三星S3设备上的粒子系统CPU占用情况。可以看出,在战斗副本中的粒子系统占用较低,但在主场景中的的粒子系统开销较高,这种情况较为不合理。
UWA Tech Doc

对于这种情况,我们的建议如下:

尝试关闭离当前视域体或当前相机较远的粒子系统,离近后再进行开启,从而避免不必要的粒子系统Update开销;
根据机型的不同档次设定粒子系统不同的复杂程度,以降低粒子系统在中低端手机上的开销。

以上则为该项目在后续研发中可进一步提升性能的主要方面。在我们测评过的项目中,实例化频率过大,GC调用频率过高、资源冗余等问题也是绝大多数研发团队遇到的共性问题。希望以上的讲解对大家的相关问题有所帮助。

最后,非常感谢《艾尔战记》研发团队对 UWA 的认可和支持。感谢他们乐于将项目性能数据与大家一起分享,让更多的研发团队了解到一款性能优秀的动作手游在各个模块上应该做到怎样的程度。同时,也希望更多的开发团队可以与我们一起来分享他们的性能数据,让更多的游戏开发者受益!





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

目录
相关文章
|
7月前
|
SQL Java 关系型数据库
调优为王!阿里巴巴彩版java性能调优实战,终于到手了!文末福利
开始之前,我先来讲一下我对性能调优的看法。在我看来Java的性能调优并不是像学习编程语言一样可以通过学习掌握,它是没有办法用直线的思维学会并掌握使用的,并且它对于程序员来说,对技术深度和广度有这十分高的门槛。
|
7月前
|
Java 中间件 关系型数据库
不会性能调优,被面试官狂虐!全靠阿里Java性能调优全彩手册死撑
性能调优从来不是一件容易的事。 可是在工作和面试中,JVM调优、MySQL调优、各种分布式中间件的调优又都是绕不过的。
|
5月前
|
缓存 算法 Java
堪称神级的阿里巴巴“高并发”教程《基础+实战+源码+面试+架构》
作为一个普普通通的程序员,如何才能提升自己的能力,在职场上拥有一技之长,这也成为普通的你我,迫切的需求。
|
8月前
|
消息中间件 缓存 Java
牛掰!阿里人用7部分讲明白百亿级高并发系统(全彩版小册开源)
高并发 提到“高并发”相信你们应该都不会感到陌生!此时你脑中应该会浮现好多有关高并发的:业务急剧增长、电商购物、电商秒杀、12306抢票、淘宝天猫各种活动等;都是需要用到高并发的,那么如何去设计一个高并发系统抵挡这些冲击呢? 其实这也是一道很常见的面试题,但是大多数应聘者都不知如何回答,从何答起。对于一个Java程序员来讲,,更关注的是不是系统架构层面的呢?从原本的定时秒杀,到现在各种活动的预热、拼团、定金膨胀、百亿补贴、跨店满减以及更复杂的组合优惠,让用户摸不到头脑,虽然这些都扰乱了用户购买的节奏,但是也一直保持着持续升温的状态。
|
10月前
|
设计模式 监控 算法
爱了爱了!阿里爆款Java性能优化神仙笔记!调优不止JVM
Java性能优化,它存在的理由有很多。计算机面对海量数据或者任务时,无论如何你都会碰到性能压力,唯一的选择是你会把这个压力放在哪一层或者哪一个位置来应对,以及采取什么应对措施。程序凑合着上线是一回事,而在压力下能够优美地运行往往很不容易。
|
11月前
|
设计模式 缓存 Java
吃透阿里2023版Java性能优化小册后,我让公司系统性能提升了200%
性能优化可以说是很多一线大厂对其公司内高级开发的基本要求(其中以Java岗最为显著)。其原因有两个:一是提高系统的性能,二是为公司节省资源。两者都能做到,那你就不可谓不是普通程序员眼中的“调优大神了”。 那么如何成为一名“调优大神”呢?
|
11月前
|
设计模式 缓存 Java
好家伙!阿里新产Java性能优化(终极版),涵盖性能优化所有操作
上月公司来了一位大佬,入职不到一周就把公司现有项目的性能优化了一遍,直接给公司节省了一半的成本。 一问情况,才知道这位仁兄也是一路被虐过来的。去年年底被裁,本以为自己技术还行,看了一段时间面经,复习了基础知识,就开始投大厂简历。阿里最先给他面试机会,结果没能扛过三面,然后是各种大大小小的公司,在实际面试中被碾压得翻不了身。整整一个半月,一个offer都没拿到,最后针对性的恶补,才入职了我司。
|
SQL 移动开发 网络协议
【优化技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(上册)
【优化技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(上册)
123 0
|
SQL 缓存 监控
【优化技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)
【优化技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)
110 0