移动游戏开发随笔(2):性能优化之调频?
同步更新在知乎。关注,获得更多手游工程开发知识。
注:本人是游戏开发工程师,不是硬件工程师,若理解有误请斧正。
如何控制功耗呢?那么这个功耗肯定和设备的核心部件的使用情况有关系,例如CPU,GPU还有内存等。首先我们要直接引入设备中频率和功耗的关系,为了方便理解下图展示某CPU设备在提高频率之后的功耗变化(
![](https://img2022.cnblogs.com/blog/439870/202206/439870-20220607005731145-437556233.png)
在这组数据中,我们能分析最直接的情况:
这里蓝线,当频率是500MHz的时候,功耗是46mW,当频率是1000MHz的时候,功率是142mW,是500MHz时候的约3倍。也就是说,对于一个核心来说,频率和功耗不是线性关系,频率提高后,功耗成曲线增长!
那么对于移动端来说,频率过高会怎么样呢?频率高了之后,最主要的表现就是电压电流变大,耗电变快,并且发热严重,甚至有可能很快的降频。显然对于移动设备来说,它是不能全力去运行的,也就是以最高频率去运行。那这里又有一个概念,如果说不能全力去运行,那么我们应该以什么频率下运行好呢?从道理上来说,一定是频率越低越好;从压榨极限来说,按照我的经验来说,应该控制在最大频率的一半以下。
那么我们应该怎么做优化?我先举个例子:
很多人在做优化的时候,是先在PC上使用性能分析工具进行优化的,他可能在PC上把一帧优化到了16ms以内,可以使游戏跑到了60帧;但是当他把游戏发布到移动设备上了之后,帧就不是很稳定,开始的时候帧率就能到60,后面逐渐减少,并且每次测帧的耗时,都有不小的差异,这是为什么?
那我们一直在介绍频率,说明这些问题肯定和频率有关吧!打比方的说,对于同一个单核CPU来说,4GHz下的16ms和1GHz下的16ms,它们一样吗?显然不是,4GHz的16ms在1GHz下是64ms啊!你4GHz的16ms,到了移动设备上也是要求它在4GHz下跑16ms,它能坚持一会儿,但是很快就会因为发热降频,然后马上帧率就掉下来了,因为在不足4GHz的情况下,16ms会变成20ms、30ms甚至60ms,然后当设备的温度降下来之后,又会升高频率——这就造成了上面说的帧不稳定的原因。
这里就必须总结出个概念,在只考虑CPU的情况下,且不考虑架构啊等等因素,我们说的帧耗时,一定是在某一个频率下的耗时。比如上面提到的4GHz下的16ms,或者1GHz下的16ms,或者是2GHz下的33ms,肯定不能只说16ms或者33ms。一定是你根据设备的功耗情况,反推出你想要控制的频率,并且在这个频率下的帧率。那这个频率应该是多少呢?按照我的个人经验,1.2GHz比较好,也就是1.2GHz下的16ms或者33ms。为什么这么低?因为CPU不像是GPU,执行的功能逻辑很少有“降级”的概念,你在制定这方面数据的时候,一定是按照较低的设备标准去制定,它们什么情况下能跑到30帧或者60帧(但也不是按照极低的设备来制定,因为永无下限)。
那么知道了上述的信息,我们怎么做性能优化呢,PC上的CPU基本都是满频率在跑啊!这里可以通过控制面板里的电源管理进行控制:
![](https://img2022.cnblogs.com/blog/439870/202206/439870-20220607005815132-946672209.png)
把“最小处理器状态”和“最大处理器状态”都改低并且改成一样的数值,比如说20%,打开任务管理器再看看当前的CPU频率。这个方法在绝大多数的CPU上都有效,你可以把主频控制在合理的范围内。另外你也可以试试其他调频软件,例如AMD官方的调频软件。
// 调整当前CPU的频率 /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq // CPU最大频率 /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq // CPU最低频率 /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq
当你通过这些方法控制住频率之后,再上性能分析器对热点进行分析吧,找到你真正的热点并优化它。同理,对于GPU,你也应该控制频率后再去分析。
有人会问,如果我真的优化不到1.2GHz下的16ms或者33ms怎么办?可以考虑把整个系统多核化,把任务分配到其他核心上,减少大核的主频的同时,小核也以低的频率来运行,大概率上会比把大核累死收益要高。这就对游戏引擎的架构设计提出了要求,可以参考历年的GDC文章。