cocos2dx lua客户端性能优化【实操篇】
一、项目背景由于经典版cocos lua游戏存在着大厅弹窗卡顿,游戏内播放动画卡顿的问题,影响了游戏的整体流畅度。所以我们根据WETEST测试出的明显卡顿点,对游戏的卡顿问题进行了分析优化。
主要思想是优化能直观感受到的帧率,提高游戏的整体流畅感,并同时保证内存或CPU使用率在一定的合理范围内,防止闪退等意外的发生。
根据游戏的优化情况,以下从优化方案、优化效果以及优化标准几个方面来分析,最后给出了锁30和60帧的建议。
二、问题描述
一般情况下,在排除网络交互问题的前提下,游戏客户端所表现出的体现在视觉感官上的卡顿慢,大都是由游戏掉帧或丢帧所引起的。因为cocos lua无法异步加载,所以大部分的卡顿都是由于drawcall过高或其他效率原因导致的,
执行函数CPU时间片占用时长过高造成帧无法在正常时间内刷新,导致丢帧。例:游戏帧数为60帧,假设函数A执行时长为0.3秒,drawcall提交所需时间为0.017秒,在某一帧执行函数A时,会占用0.3秒CPU时间片,
导致函数A执行期间的18帧无法得到正常刷新,并且提交drawcall需要一帧的时间,所以最终导致丢19帧。
以下主要从这个方向出发,提出优化的思路和方法。
三、优化思路与方法
**** Hidden Message *****
三、优化效果
以下内容均节选自Wetset测试报告高配机的测试情况.
测试前后游戏PSS和CPU的占用都在合理范围内,不是造成卡顿的主要原因。因此主要对比优化前后卡顿明显的FPS大于25(锁30帧)和50(锁60帧)的比率和对应的DrawCall峰值情况。
根据优化标准里DrawCall的定义,理论上实际的DrawCall峰值不会根据机型配置和锁帧数的不同而有很大差异,可能测出来会有1~2微小的差距,所以这里认为锁60帧和30帧的DrawCall是相同的。锁30帧的情况下,大厅优化前卡顿点会有一段时间低于25帧,drawcall峰值也相对较高。优化后FPS持续保持在25帧以上,并且drawcall峰值也降低很多。锁60帧的情况下,优化前卡顿点会有一段时间低于50帧,优化后FPS持续保持在50帧以上。
2.游戏内优化前后对比
游戏内主要卡顿点为游戏开局的亮牌流程和结算流程,以及出牌过程中的播放声音和动画。锁30帧的情况下,优化前这几个卡顿点都会降到25帧以下,结算只有几帧;优化后维持在25帧以上。锁60帧的情况下,优化前这几个卡顿点会降到45帧一下,优化后维持在45帧以上。
游戏内drawcall峰值修改前可达200以上,优化后为降低到100以下。
四、优化标准
根据游戏的优化效果对比情况,结合WETEST的推荐标准,给出了以下优化后的标准供参考。
PSS
在安卓系统中一般使用PSS内存衡量每个进程内存的实际使用大小,当PSS内存峰值过高时容易引发Crash。因为同一款游戏在不同品牌的手机上内存占用差距极大,建议使用腾讯TDR标准推荐的机型进行测试。根据WETEST的推荐标准,要求高配机型PSS内存峰值必须低于650MB,中配机型低于550MB,低配机型低于450MB。
CPU
当游戏占用CPU过高时,游戏可能会出现运行缓慢、卡顿、闪退等现象,严重影响玩家的游戏体验。 游戏在测试中主要关注核心游戏场景的CPU占用情况,根据WETEST推荐标准,要求CPU占用均值不超过30%。
FPS
FPS对游戏来说意味着用户可感知到的游戏流畅度,游戏着重关注游戏在默认配置下,核心游戏场景的帧数(fps)连续性。根据游戏优化前后效果对比数据,要求锁30帧的情况下,游戏的帧数不低于25帧。锁60帧的情况下,游戏帧数不低于50帧。
DrawCall
每次引擎准备数据并通知GPU的过程称为一次Draw Call,NVIDIA 在 GDC 曾提出,25K batchs/sec 会吃满1GHz的CPU 100% 的使用率。所以他们推出了一条公式,来预估游戏中大概可以 Run 多少个 Batch:
按照这个公式,按低配机的标准,可以得出DrawCall的理论标准上限。目标30帧,使用1.2GHz的CPU,20%的工作量发给DrawCall来使用(这里20%的渲染百分比是推荐值),可以根据上面的公式,200 Batchs/Frame = 25K*1.2*(0.2/30)。目标60帧,100 Batchs/Frame = 25K*1.2*(0.2/60)。
根据以上公式,在实际应用中,游戏的DrawCall峰值只要满足小于低配机的理论上限,就一定能够满足中高配手机的理论上限。因此,要求锁30帧的情况下,游戏DrawCall峰值低于200,锁60帧的情况下,游戏的DrawCall峰值低于100(由于这个是理论值,而且这里的20%的渲染百分比也是推荐值,所以在FPS满足标准的情况下,这个值适当高于标准也是可以接受的)。
五、关于锁30帧和60帧的问题
从项目的实践中发现,直观感受上进行对比,游戏锁60帧弹窗动画的流畅度是明显强于30帧的。但权衡考虑,为了照顾低端机型和发热的问题,30帧下的优化也是要做的,以下内容给出了30帧与60帧的对比情况以供参考。
建议可以提供流畅模式和省电模式供用户选择30帧和60帧,从而更好的满足用户体验,但是这个内容我们游戏并未实施,无法判断需求的真伪。
DrawCall理论峰值
根据优化标准里的分析,拿1.2GHz GPU的低端机进行理论分析,锁30帧下的DrawCall理论峰值为200,那么锁60帧下的DrawCall理论峰值就是100。可以看出同一机型下,锁60帧对游戏的DrawCall峰值要求更为严格。
掉帧情况
锁60帧掉帧的幅度相对锁30帧会更大一些,不过一些锁30帧掉帧感觉卡顿的界面锁60帧下好很多,经过优化锁30帧下保持在25帧以上,锁60帧基本保持在50帧以上,游戏内可能差些,不过也保持在45帧以上。
流畅度情况
经游戏研发、游戏运营和发行运营的多方体验,在锁定30帧与锁定60帧两种情况下播放同一带抖动效果的弹窗动画,即便是30帧和60帧两种情况均未出现掉帧的现象,锁60帧在主观感受上流畅程度也要明显优于30帧。
此外,针对弹窗动画,我们游戏在使用backeaseout的动画曲线的前提下,分别做了以下四组对比实验,期望通过调整动画来提高30帧在视觉上的流畅程度:
1.“10%-100%放大“放大效果的30帧与60帧对比;
2.“60%-100%放大”放大效果的30帧与60帧对比;
3.“cocos studio内编辑动画”的弹窗动画实现方式的30帧与60帧对比;
4.”游戏代码内实现动画”的弹窗动画实现方式的30帧与60帧对比;
但最终发现,无论在哪一组对比试验中,在主观体验上锁60帧的流畅程度都要明显优于锁30帧。
耗电和发热
由于通过WETEST测试出的耗电量,三种机型,用30帧和60帧测试2000s以上均为4%左右,不是很准确,无法参考。因为我们游戏曾用小米M2SC低配机测试观察,发现4000s测试时长下,锁60帧耗电量为37%,比30帧的27%多耗电10%,发热也更严重。中高端机还未准确测试,需根据自己的情况进行调整
点赞,值得学习! 不错 学习一下 学习下~ 厉害厉害,还有人关注在这个技术呀 66666666666666666666666 66666666666666666666666
页:
[1]