移动游戏开发随笔:性能优化之功耗?
同步更新在知乎。关注,获得更多手游工程开发知识。
在移动端上开发游戏,我们总会有一个疑问,为什么测试产品运行在手机设备上会发热?我们可以直接说出这是功耗的问题,但是什么原因导致了发热,如何去解决这个问题?错误的问题解决方法会造成在功耗的优化上只有微少的收益,或者基本没有收益。
那么对于经验尚浅的工程师,他会怎么思考呢?直接根据网上的各个优化思路来进行优化?比如说,直接把贴图尺寸全部缩减到原来的一半,把模型的面数直接砍半,着色器直接简化到自发光方式去计算,抑或直接降低整个屏幕的分辨率?没有任何科学的依据,只是凭借直觉和经验来制定优化的策略:“我觉得这么做就可以减少功耗”。但这是不科学的,是唯心的,违背了物理的基本规律,从结果来看的确能降低一部分功耗,但是游戏的品质也就因此大打折扣了。但是这大概是大部分游戏开发工程师所使用的方法。如果你是这样的工程师,从这篇文章开始,我希望能够纠正你的错误思路,并且给你在正确的方向上一些引导。
但是我也不是一个专业的硬件工程师,只能从软件工程师的角度去理解,如果有所错误也在所难免。
在初中物理中,我们学过电功率的概念,电功率=电流x电压。那么对于手机来说,想要知道当前的功率,那么我们应该知道当前手机的电压和电流的情况。如果你拆解过手机,看过手机电池的包装,我们可以得到:
那么这里我们可以得到一个信息,这个电池的工作电压是3.7V,容量是1000mAh。如果我们考虑的是理想状态下,也就是不考虑电池的电压差,假设把电池的电压认为是固定3.7V,那么会变化的就是电池的电流。根据电功率公式,如果电流是1A左右,那么功率就在3.7W左右;如果电流是2A左右,那么功率就在7.4W左右。又根据容量,单位是mAh,也就代表1mA的电流可以持续放电1000小时,那么1A的电流这块电池只能放电1小时。
那么我们知道了功率的变化量实际是电流,这时候我们就会问,那我应该把电流控制在多少合适呢?这里给出两个参考。
第一个参考是,目前通常的手机电池容量基本都在3000mAh-4500mAh左右,假设我们使用一块3000mAh的电池,如果当前的电流达到1A,那么电池可以持续放电3小时,也就代表电池满的手机可以持续玩3个小时;如果电流达到2A,那么电池可以持续放电的时间就变成了1.5个小时,也就是代表电池满的手机可以持续玩1.5个小时。我们以用户的使用体验的视角来看,如果电流达到2A,可以持续玩1.5个小时也就是90分钟,假设我们电池的容量是均匀减少的,也就是理论上说玩10分钟基本要掉约11%的电池容量,作为用户这个体验会很好吗?这里得到的第一个结论是,我们必须根据电池的放电时长规定电流大小的上限。
第二个参考是,我们人类的体温是36度左右,手掌感觉到热的温度大约在40摄氏度左右。当手机的温度达到40摄氏度的时候我们会觉得微热,当温度达到45度的时候我们会明显感觉到热,如果温度超过50度我们会觉得烫手。我们可以先固定屏幕亮度到合理的范围,编写测试程序在手机的CPU和GPU上进行压力测试,看看电流到多少的时候,手机可以持续微热并且不会累积到发烫的程度,这个电流就是我们所能达到的极限。可以用手触摸感觉,也借助工业的测温枪进行更精确的测量。当然这个测试也受限于不同的设备的散热,以及当前环境的温度状况。
注意,我这里说的都是理想情况的估算,并不是实际的设备真实的物理数据,事实上手机电池的电压并不是一直固定的,电池的放电过程也不是均匀的。介绍这些的目的是要给你树立功耗的概念,作为手机游戏开发时候优化的参考意见。如果需要真实的数据,请参考更专业的资料。
通过这两个参考,其实我们可以在这里提出一个概念:当我们在宣传真机实录的游戏画面品质的时候,我们应该提到这是多少功耗(瓦特)下的画面品质。否则在不考虑功耗的情况下,手机设备的确可以短时间内把电流增大提高功率,却很快会因为发热降频,而你看到的精品游戏画面可能是这瞬间的最佳品质而已,后期因为续航和手感的原因,真正到用户的设备上时又是砍的惨不忍睹的画面效果。
那这里又会提到,我们怎么测定电流的大小呢?这里又给出两个方法进行参考。
第一个方法是,读取手机内部的计数器,比如Android系统提供的
/sys/class/power_supply/battery/voltage_now /sys/class/power_supply/battery/current_now
这个方法的好处是,不用对手机进行任何改造就可以获得数据;缺点是,这个数据及其不灵敏。
第二个方法是,拆解手机,直接把电池排线接上稳压直流电源,这样稳压直流电源就可以非常直接的提供电流的变化信息。
但是这个方法需要拆解手机,会破坏手机本身的散热,并且对动手能力有一定的要求。
有了参考的电流数据,和当前的测得的电流数据,就有对功耗需要优化多少有了直接的概念。