作为游戏行业的服务商,UWA 不仅为游戏开发者提供高效的性能优化工具,也致力于为行业提供更全面、更具体的信息和服务。为此,UWA 今天发布 2019-2020 年度手游蓝皮书,从总体性能数据、引擎各模块开销、内存占用等方面进行汇总分析,呈现 Unity 手游行业现状。
这是侑虎科技原创文章,欢迎转发分享,未经官方授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ 群:793972859)
MMORPG 作为目前游戏市场上的头部力量,在 UWA 测评过的项目中,也占据了主要份额,因此我们以该类型的测评数据为例,为大家呈现 2019-2020 年的手游性能现状和发展趋势。
报告目录:
1)MMORPG 手游总体性能开销分析
2)MMORPG 手游 CPU 模块性能开销分析
3)MMORPG 手游内存模块性能开销分析
4)MMORPG 手游资源管理分析
5)UWA 对于 MMORPG 手游研发团队的建议
Android 设备的 CPU 均值主体范围为 14.7~78.9 ms,且主要集中在 17~33ms 和 33~50ms 两档。
按照 UWA 官网(www.uwa4d.com)的测评机型分类,我们将统计的性能数据分为低端、中端和高端;在趋势图中则直接以最具有代表性的低端和高端来展现。
大部分 MMORPG 手游在中低端设备的性能开销较高,大于 33ms 的耗时占比范围在 60%~70%。
无论是高、中和低端的 Android 设备,渲染和逻辑代码都是需要研发团队重点关注的,它们的消耗总和占了总开销的近 70%。逻辑代码的耗时占比依然很高,这主要与角色、怪物的数量越来越多相关。随着其不断增加,逻辑状态的更新开销、AI 开销等都在大幅增加,这是需要游戏研发团队中密切关注的耗时瓶颈。
下面我们就来具体分析这些主流模块的开销情况。
◆◆◆◆◆严重程度:地狱
为了能够更好地反映出各个性能参数的整体使用情况,我们统计了每种性能参数的主体使用范围,其范围区间是 [5%~95%],以下数据中 P5 代表 5%,P50 代表均值,P95 代表 95%。
在过去的 4 个季度中,半透明渲染和不透明渲染在低端设备上的 CPU 耗时在不断下降,Q2 略有回升,这意味着游戏团队对于引擎渲染模块的理解越来越深入。
严重程度:地狱
1)GC 触发频率很高,是造成卡顿的主要原因之一,目前只有 36.8% 的项目可以将 GC 的触发频率控制在 1000 帧/次以上。
2)随着 MMORPG 游戏越来越重度化,GC 平均耗时在逐步上升。GC 耗时会逐渐成为游戏运行时的主流性能杀手,需要研发团队时刻注意!
我们可以看到,在过去的 Q2 中,Instantiate 调用频率有明显下降,这说明大家在项目中不断重视对于资源 Instantiate/Destroy 的管理。
如果大家的项目中仍有大量的 Instantiate/Destroy 调用,那么我们建议您着重查看 UWA 线上性能报告中资源管理分类的 “资源实例化/激活” 页面,通过它可以快速掌握到底具体哪些 GameObject 在不停地被执行实例化操作,从而更为高效地减少不必要的性能开销。
Shader.Parse 操作是比较突出的性能杀手,但我们看到在 2019 的 Q4 中已经大幅度下降,目前平均每次调用的 CPU 耗时主要分布在 0.8~74.9 ms。
严重程度:地狱
目前我们主要统计了 NGUI、UGUI 和 FGUI 的占比以及详细的使用情况。在刚刚过去的四个季度中,UGUI 的使用占比依然强势,最高时可达 72%。NGUI 的占比有明显下降的趋势,而 FGUI 有明显上涨的趋势。
下面我们将分别说明它们的 CPU 耗时和堆内存占用情况。
UI 模块的性能开销依然很高,但相较于去年相比确实有进一步提升。这主要是在这一年多以来,各大研发团队对于 UGUI 的理解和掌握都在不断深入。当然,现在 UGUI 的明显性能问题主要有以下四方面:
1.Draw Call;
2.重建;
3.OverDraw;
4.主线程阻塞。针对以上问题,大家可以通过 UWA 学堂(https://edu.uwa4d.com)中 UI 相关的相关技术问题和视频进行学习和了解,相信对帮助大家快速提升 UI 方面的技术理解大有裨益。
FGUI 的性能看起来很不错,但是目前 FGUI 的使用量较少,可能存在一些统计偏差。仅供参考。
严重程度:普通
动画模块在最近一年来的性能表现一直较为平稳,这说明大家对于动画模块中应有的性能优化点掌握已经较为到位。虽然 MMO 项目中的角色、NPC 和怪物等数量持续有在增加,但在这些模型多数是通过 GPU Skinning 的方式来完成。这种方式对于实现场景中的大量同种怪物非常有效。
严重程度:普通
物理模块的性能存在上升趋势,特别是高端设备上。对于使用 Unity 2017.4 版本以后的团队,Auto Simulation 和 Auto Sync Transforms 是大家需要关心的参数,以避免不必要的性能耗时。
严重程度:普通
◆◆◆◆◆粒子系统的 CPU 开销普遍较低,但总体使用数量峰值在 2020 Q1 后大幅上升。我们依然建议研发团队尽可能将数量峰值控制在 600 以下(低端设备)和 1000 以下(中高端设备)。对此,建议研发团队经常通过以下两方面来检测自己的粒子特效使用情况:
1)粒子系统(特别是技能特效)的配置文件是否过量;
2)特效中是否含有长久不用的粒子系统。
严重程度:噩梦
内存泄露问题在过去的一年中明显加重,40% 的提测项目都存在泄漏的问题。
我们建议研发团队后续可更为频繁地进行检测和监控,即可进一步降低堆内存泄露的风险。研发团队可通过以下两种方式高效地对堆内存泄露函数进行分析和优化:
1)UWA GOT Online 中的详细 Mono 堆内存分析和 Lua 性能分析报告;
2)UWA 线上深度测评中的详细 Mono 堆内存测评报告。
严重程度:地狱
总体内存在最近的一年里,峰值均值稳步提升,共计提升了 132MB。随着高端移动设备的普及、MMO 游戏的逐步重度化,内存逐步提升是一个必然的趋势。目前,项目中的主要内存瓶颈依然是资源和 Mono 堆内存。对此,我们将在接下来的文章中进行详细分析。
严重程度:地狱
总体堆内存在最近一年里上升趋势非常明显,这主要是游戏的重度化所致。但另一方面,也是研发团队对于 Mono 堆内存分配的疏于管理所致。就目前而言,Mono 堆内存过高主要是因为配置文件的序列化库使用不当所致。
项目的内存占用很大一部分来自于资源的使用,下面我们将对项目中主流资源的使用情况进行分析。
严重程度:地狱
如上图所示,对于纹理资源来说,在过去的 4 个季度中,其内存占用处于上升阶段。建议研发团队对于纹理 Mipmap 使用情况、渲染利用率等进行进一步的检测和完善。
严重程度:地狱
1)网格资源内存峰值主要分布为 12.7~ 96.1 MB,且主要集中在 60MB 以内。
2)MMORPG 游戏的场景普遍较大、角色普遍较多,因此,其网格资源量明显高于其它类型游戏。但从使用趋势上来看,其最近一年的使用趋势较为平稳,均值均在 50MB-80MB 浮动。
严重程度:普通
动画模块的内存使用趋势较为平稳,平均峰值内存长期控制在 20~40MB 区间之内。
严重程度:普通
这里,UWA 仍然需要提醒的是,Standard Shader 在大家的项目中被经常误引入进来,建议大家在UWA 性能简报中的 “具体资源使用信息” 中特别关注 Standard Shader 的使用情况。
严重程度:噩梦
RenderTexture 的内存占用在进入 2020 年 Q1 以后上升趋势明显,特别是在低端设备上,随着大家对于图像后处理效果的需求提升,后续很可能会出现 RenderTexture 使用程度大幅提升的情况,因此,建议研发团队对 RenderTexture 密切关注。
严重程度:噩梦
◆◆◆◆◆粒子系统的使用数量过大,从而导致其内存占用过高。对此,其最有效的优化方法还是降低粒子系统的使用数量,同时研发团队可以考虑在高端设备上使用 GPU Particle 新功能,将大幅度提升粒子模块的性能。
AssetBundle 加载方式(Load 和 LoadAsync)的使用占比在过去的一年中都保持在 80% 左右。毫无疑问,AssetBundle 加载方式是目前绝大多数研发团队的资源加载首选。
在接下来的一年中,我们仍然建议大家使用 AUP(Async Upload Pipleine)功能来尝试达到更高的加载效率。关于 AUP 中需要特别关注的技术点,建议查看 UWA DAY 2019 中的相关分享《Unity 引擎加载模块和内存管理的量化分析及优化方法》,同时,我们在今年 UWA DAY 2020 上有了更详细的补充,建议大家后续关注。
在众多加载方式中,LoadFromFile 加载方式依然是一家独大,LoadFromFile+LZ4 的组合在移动游戏中加载性能优势明显,依然是移动游戏资源加载的不二选择。
1)对于 Instantiate/Destroy 的完善,研发团队需时刻关注缓存池的使用是否合理;
2)对于 Active/Deactive 的完善,则需要研发团队尽可能注意避免 UI 和动画角色的频繁调用,从而尽可能避免不必要的调用开销。
除了以上信息,今年 UWA DAY 2020 上我们还分享了其他重要的性能参数数据,不仅适用于 MMO 项目:譬如 ASTC 纹理的使用情况、SRP 项目的使用情况、颜色空间的使用情况等,这些都是大家在立项或研发阶段较为关心的话题,我们将在后续的 UWA DAY 2020 视频中播出,欢迎大家关注。
SRP 和颜色空间的使用情况图
ASTC 纹理的使用占比趋势图
热更新库和序列化库的使用趋势图
同时,我们将本地资源检测服务中的检测结果进行了分析统计。对于检测未通过率高达 70% 以上的 Top10 的检测规则,建议大家多关注。研发团队也可以自行使用该服务,以检测自身项目是否存在类似的问题。
1、 警惕渲染模块、逻辑代码这两大性能杀手!随着精品化 MMORPG 项目的日益增多,这两项在接下来依然是研发团队在性能优化时的重中之重!
2、 内存泄露问题在过去的一年有恶化趋势,数据显示 40% 的项目存在着泄露问题,Mono 堆内存、纹理、网格、RenderTexture 和粒子系统依然是大家接下来需要关注的重点。特别是 Mono 堆内存部分,对于序列化信息的管理已经刻不容缓,在接下来的一年,UWA 会尽可能为各大研发团队解决和监控这一内存难题。建议通过 Mono 和 Asset 模式持续监控。
3、 资源加载方面,在过去的一年中,LoadFromFile(Async) 已经是移动游戏项目中的主流加载方式,AssetBundle.Load(Async) 同样也是资源加载的主流方式,并且取得了明显的效果,UWA 也建议国内各大研发团队开始着手进行学习和研究。
4、GPU 性能问题在过去的一年中逐步凸显,在不少超重度 MMO 游戏中,GPU 已经俨然成了游戏项目的主要瓶颈,对此,建议研发团队通过 GOT Online 的 Overview 模式检测 GPU 耗时,从而定位 GPU 的瓶颈。
* 本报告中的数据最终解释权归侑虎科技所有。