【求知探新】独立游戏《Abi》场景耗时分析

news/2024/7/10 4:40:32 标签: 优化, 耗时分析, 游戏, 性能优化, 手游

原文链接:https://blog.uwa4d.com/archives/Analysis_Abi.html

【求知探新】是UWA新推出的栏目。在UWA团队做性能优化的过程中,常常会遇到一些未知的问题,在这里我们将分享UWA研究这些问题的完整过程。当然需要说明的是,一个好的问题没有标准的答案,在此也欢迎大家来积极拍砖!


今天我们分享的内容,是来自当下热门的独立游戏Abi,该游戏由莉莉丝开发,目前在Taptap上已获得9.6的高分。在测试该项目时,我们发现了其在中低端手机上帧率较低,且设备发热较为严重。通过和研发人员的沟通,我们剖析了导致该问题的原因,并将分析过程和解决方案在此分享。


一、问题描述

游戏在该场景下测试时,中低端设备上的表现为帧率较低,且设备发热较为严重。

请输入图片描述


二、问题复现

针对研发团队提供的例子,我们进行了研究分析,并在低端设备上(红米2 & 红米Note2)复现了该问题,具体CPU耗时如下图所示,无论是红米2还是红米Note2,其帧率均在25帧以下。

请输入图片描述
红米2:Gfx.WaitForPresent – 平均46ms

请输入图片描述
红米Note 2:Gfx.WaitForPresent – 平均31ms


三、问题分析

Gfx.WaitForPresent在低端机上持续过高,这可以说明目前的性能瓶颈是在GPU上,而非CPU上。对此,我们对其场景进行了检测,发现如下:

(1) Android端已经关闭AA功能;
(2) 场景中存在两个Realtime的Directional Light,且均开启了实时阴影;
(3) 场景中存在5~6个Realtime的Point Light。

从检测结果来看,场景中实时光源过多,是GPU压力过大的主要原因。因此,我们对其进行了测试,我们只保留场景中一个Directional Light为Important光源,而其他光源均设置为Not Important,其在红米Note2设备上的性能开销如下图所示。Gfx.WaitForPresent已经降低到平均14ms,且帧率已经被稳定在45FPS。

请输入图片描述

同时,我们也尝试关闭一个Directional Light的实时阴影,但性能提升不明显,这说明该阴影并不是GPU端的主要压力。

另外,我们也测试了两种不同情况下的设备耗能情况。在未优化的情况下,移动设备(测试设备为小米5S)的耗电率为20.07%/小时,在只保留一个Important Directional Light时,移动设备的耗电率下降到16.44%/小时,即设备耗能节省了20%。


四、结论

从上述分析可知,当前游戏场景在中低端设备上帧率较低、发热较快的主要原因是GPU性能压力过大,而根本原因是场景中使用了过多的Realtime光源。对此,建议研发团队根据实际情况,尽可能控制场景中的Important实时光源数量,从而降低GPU的性能压力。


文末,感谢Abi团队对于UWA团队的认可,并同意将以上研究过程中的性能数据在此分享。同时,我们也欢迎大家在UWA问答社区(answer.uwa4d.com)积极提交研发过程中遇到的问题。也许随着时间的流逝,科技的进步,答案将变得廉价,但问题会变得更有价值,因为提问和研究将比回答更有力量。

PS:安利这款超暖心的游戏,已经可以在TapTap上预约了哦~
请输入图片描述



http://www.niftyadmin.cn/n/1031990.html

相关文章

直播预告 | 极限挑战:在最短时间内定位性能瓶颈!

原文链接:https://blog.uwa4d.com/archives/1943.html ChinaJoy的大浪过后,多数研发团队又投入到了玩法更新以及性能优化的苦战中。在争分夺秒的手游市场,拼的不仅是速度与激情,更需要合适和正确的方法。为此,UWA将此福…

k8s的pod分类、核心组件、网络模型

k8s的pod分类、核心组件、网络模型 k8s的pod分类 自主式Pod 这种Pod本身是不能自我修复的,当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上 。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故…

8.10 直播回顾 | 一个小时内,我们用UWA GOT解决了这些问题...

昨天UWA技术直播间,UWA当家主播强哥再次强力圈粉,凭着备受粉丝认可的极具磁性的声音,过硬的技术实力以及在手上挥洒自如的的黑科技UWA GOT,UWA这次几乎将压箱底的绝招都公开啦!接下来,让这个视频告诉你UWA是…

kubectl常用命令

kubectl常用命令 get # 以 ps 输出格式列出所有 pod [rootk8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-6d8d776547-jpjgk 1/1 Running 0 10m myapp-6d8d776547-lddcv 1/1 Running 0 …

UWA 新功能 | 优化方法进阶—定位子函数的开销

原文链接:https://blog.uwa4d.com/archives/1985.html 通常情况下,通过代码堆栈去定位项目性能瓶颈是最一针见血的方法,并且UWA的线上性能测评报告中已经支持了该功能。今天,我们在原有功能的基础上加大分析力度—支持子函数代码…

UWA 两周年 | 优化就是在和时间赛跑

原文链接:https://blog.uwa4d.com/archives/UWA_Anniversary2.html UWA满两周岁了。在这两年时间里,我们完成了产品的设计和研发;进行了近6000次线上性能测评,测试帧数近8400万帧;完成了1600次线上资源检测&#xff0c…

通过资源定义方式创建一个haproxy的pod进行负载均衡

通过资源定义方式创建一个haproxy的pod进行负载均衡 yaml文件 [rootk8s-master manifes]# cat haproxy.yaml --- apiVersion: apps/v1 kind: Deployment metadata:name: rs1namespace: default spec:replicas: 1selector:matchLabels:app: nginx1template:metadata:labels:a…

k8s资源调度

k8s资源调度 Scheduler调度器做为Kubernetes三大核心组件之一, 承载着整个集群资源的调度功能,其根据特定调度算法和策略,将Pod调度到最优工作节点上,从而更合理与充分的利用集群计算资源。其作用是根据特定的调度算法和策略将Pod…