M K*_*atz 13 android opengl-es power-management ios
我的游戏使用了太多电池.与同类游戏相比,我不确切知道它使用了多少,但它使用了太多.玩家抱怨它使用了很多,其中一些人注意到它使他们的设备"运行热".我刚刚开始研究这个问题,并想提出一些理论和实际问题来缩小搜索范围.这主要是关于我的游戏的iOS版本,但可能许多相同的问题影响Android版本.很抱歉要问很多子问题,但它们似乎都是相互关联的,我认为最好把它们放在一起.
附注:我的游戏不进行网络访问(在几个地方称为大电池耗尽)并且在后台不消耗大量电池; 它是前台运行的问题.
(1)我知道有API可以读取电池电量,所以我可以做一些自动化测试.我的问题是:关于需要多长时间(或者可能:大约耗费多少电量)我需要让物品运行以获得可靠的读数?例如,如果它运行10分钟是可靠的吗?如果它排出10%的电池,那可靠吗?或者运行更长时间更好(或者说,看看电池耗电50%需要多长时间)?我在这里问的是电池表的灵敏度/可靠性,所以我知道每次测试需要多长时间.
(2)我试图了解电池使用率高的可能原因.下面列出一些可能的因素.请帮助我了解哪些是最有可能的罪魁祸首:
(2a)和很多游戏一样,我的游戏需要在每个帧上绘制全屏.它的运行速度约为30 fps.我知道Apple说"只需要根据需要刷新屏幕",但我几乎需要绘制每一帧.实际上,我可以将一些工作只绘制到已经改变的屏幕部分,但在我的情况下仍然是屏幕的大部分.在任何情况下,即使我可以将绘图本地化到屏幕的一部分,我仍然每秒进行30次OpenGL交换缓冲区调用,所以我努力画得少一点真的很重要?
(2b)当我绘制屏幕元素时,会有一定量的浮点数学运算(例如,在计算纹理UV坐标中),以及一些(较少)双精度数学运行.与类似的整数运算相比,我不知道它们在电池方面有多贵.我可能会缓存很多这些值而不必重复计算它们,如果那可能是胜利的话.
(2c)渲染场景时,我会进行一定量的纹理切换.我以前只是担心这会使游戏太慢(它没有),但现在我也想知道减少纹理切换是否会减少电池的使用.
(2d)我不确定这对我来说是否实用,但是:我一直在阅读着色器和OpenCL,我想了解我是否要将一些CPU处理卸载到GPU,这是否可能节省电池(除了可能为矢量型操作运行速度更快).或者它可能会在GPU上使用比CPU更多的电池?
我意识到我可以通过禁用游戏的某些部分并进行迭代电池测试运行来缩小哪些因素在起作用(因此问题的第(1)部分).只是因为禁用并不是微不足道的,并且有足够的潜在罪魁祸首,我认为我首先会要求提供一般建议.
尝试阅读这篇文章: Android 优化文档
对我来说最有效的是减少垃圾收集的使用,
例如,在为台式计算机编程时,您(或我)习惯在循环内定义变量,而循环外不需要它们,这会导致大量使用垃圾收集(我不是在谈论原始变量,而是大对象。
尝试避免类似的事情。