基于移动设备算力的UWA性能标准系统上线

基于移动设备算力的UWA性能标准系统上线

在日常的游戏优化过程中,我们总是被研发团队问到这样的问题:

“4GB内存的设备上,我们的PSS内存应该控制在多少以下?纹理内存、Mono内存、Shader内存应该在多少以下是正常的?”
“XXX设备上跑多少三角形面片合适、Draw Call应该控制在多少以下较为合理”
“我们在XXX设备上,Animators.Update耗时达到了6.8ms,这个算高还是算低?我们需不需要再优化,优化到多少合理?”
“我们在XXX设备上温度达到了55度,这个温度算高吗?”

是不是这些问题看起来似曾相识?这本质上涉及的是游戏研发中一个非常重要的方面—标准化。绝大部分商业游戏都会在立项时考虑这个问题,就是我们项目的开发标准是什么,这里面有制作标准,也有质量规范。上述那些问题,就是研发团队特别关心的性能或质量标准中的一小部分。大家都希望可以得到一个较为明确的答案:某款设备上的某个具体性能指标应该是多少或多大范围等等。但是,这个需求看上去很简单,但解决起来却非常不容易。

首先,我们需要针对大量设备进行合理的算力分档,目前世界上的移动设备已经有上万种,且每年仍有大量的新机型推出。同时,不同机型的计算能力很可能是完全不同的,比如小米5S和小米12的算力是完全不一样的。所以,我们需要先将如此大量的设备进行合理的分档,不同档次设备对应的性能标准也不应该相同。

为了解决这个问题,我们设计并实现了一套UWA设备分档方案。UWA设备分档综合考虑了设备配置、最新的硬件参数、用户的使用反馈,以及海量测试设备的分布数据,目前可以做到及时更新以反应硬件环境与设备分布数据的变化。

其次,标准化的过程是一个不断提炼重要指标的过程,一款游戏项目是非常复杂的,它拥有渲染、UI、逻辑代码、加载、物理、粒子系统、内存、ALU、带宽等多达三十种不同的模块或系统,而每种模块又可以继续拆解出更多更加详细的指标。它就好比一个人体的体检报告,先细化到心肝脾胃肾等脏器,然后再逐步拆解到各种酶、各种蛋白指标等等。所以,要不断分析出到底哪些指标可以反映出渲染模块性能的好坏,哪些指标可以反映出物理模块性能的瓶颈,这就需要对于性能优化本身具有非常深入的掌握,并且要随着引擎的不同、设备的不同而不断迭代。

再次,开发团队也有自身的项目需求。有些项目希望可以在设备上稳定运行30帧,有些项目则希望可以稳定运行60帧;有些项目希望可以在2GB内存的设备上稳定运行,有些项目则为了更好地表现力加载更多的资源,从而放弃3GB内存以下的设备。这些项目自身需求的不同也会导致性能标准的不同。为此,我们对海量的性能测试数据进行分组分析,持续挖掘各指标在各档设备中的统计规律与重要程度,建立指标与目标帧率间的影响模型,从而得到不同设备、不同目标下各性能指标的阈值范围。

最后,如何验证这些指标的合理性和普适性,则是标准的重中之重。通过我们的优化专家来审视指标范围进行合理性,再根据不同的引擎版本、功能设置,建立重要指标的实验项目,根据真机实验数据对指标阈值进行校验与调整。经过调整后,能够得到一个排除异常值干扰,可行性得到验证的性能标准。同时,我们会持续针对最新的测试数据来进行比对和跟踪,以保证标准的时效性。

通过解决以上四个大问题,以及无数个细节问题,我们终于可以面向大家推出我们UWA自己的性能标准体系。它可以做到针对不同档次的移动设备、不同的项目目标、不同的游戏模块提供不同的具体性能标准。

当大家在通过自己内部不同的移动设备测试和分析游戏性能时,我们会根据研发团队的测试机型来自动为其定档,同时根据档位和目标帧率提供对应的性能标准。

下图是某游戏在同一场景中两款不同移动设备上的指标推荐值反馈。

很明显,研发团队自己针对设备做了适当的分级:

  • 在低端设备魅族M6 Note设备上,Triangle峰值达到在23.8w,这里UWA建议Triangle峰值小于15w,所以在低端设备上该项目在场景下的Triangle使用量较高,可以进一步通过报告来定位哪些局部的Triangle使用量较大并进行简化;
  • 在中高端设备华为Mate20设备上,虽然项目的Triangle峰值达到了31.5w,但我们建议小于45w,所以在该设备上,该场景的Triangle使用量处在合理范围之内,而且还可以跟美术团队商量是否可以增加部分区域的模型细节,以达到更好的视觉展现力。

同样的,渲染模块的Draw Call、不透明/半透明渲染耗时、动画模块、物理模块等相关指标推荐值都会根据机型档次的不同而不同。

再来看内存占用的标准,下图为一款项目在红米4X和小米8设备上的纹理内存使用情况和指标推荐值。在红米4X低端设备上,项目的纹理内存使用峰值为136.9MB,推荐值为小于140MB;而在小米8设备上,纹理内存使用峰值为219.5MB,该值在该设备上也不会引起内存崩溃,因为推荐值为小于280MB。

另外,大家可以在项目中设定目标帧率。不同的目标帧率,性能指标的推荐值也会随之变化,从而将超过阈值的性能项进行重点提示,如下图所示。

当然,UWA性能标准会随着我们性能数据的不断增加、硬件设备算力的不断强化、引擎版本的不断变化而持续迭代。

同时,为了让大家可以更有针对性地对自己的项目标准进行设定和规范,我们还提供了用户自定义阈值功能。更改推荐值后,不满足推荐值时会出现对应优先级的优化任务。目前UWA提供的阈值分类包括如下三类:

【内存占用推荐值】
我们知道,资源内存和Lua内存是常见的内存杀手,研发团队可结合目标机型的内存大小做对应的分级设置,譬如分辨率、后处理等分级策略。

【引擎模块推荐值】
这里包括常见的优化指标:DrawCall、Triangle数量、各个引擎模块参数值等。

【运行信息推荐值】
包括我们运行时的性能指标,譬如CPU耗时、帧率、网络传输、Mono分配等参数。

有了这些参数后,大家可以快速地设置一套贴合项目自身需求的阈值方案。同时,我们每年都会发布行业的性能蓝皮书供大家参考。

除此之外,最新版本的UWA评分也做了迭代优化,以便给大家一个更为明晰的优化方向。

  1. 项目评分由“运行性能”、“项目资源”和“包体资源”三项组成;
  2. 任一模块评分更新时,都会更新项目的评分;
  3. 每天会校验上述评分模块,若过去15天内评分未变更,将会根据上述规则计算各模块的评分,并更新项目评分。

UWA希望阈值自定义的功能可以帮助研发团队更加接地气地落地优化工作;评分优化功能则是帮助大家找到更多优化抓手和思路,每一分都用在刀刃上。