13

我的游戏耗电过多。与同类游戏相比,我不知道它使用了多少,但它使用了太多。玩家抱怨它使用了很多,其中一些人注意到它使他们的设备“运行热”。我刚刚开始对此进行调查,并想提出一些理论和实践问题来缩小搜索空间。这主要是关于我的游戏的 iOS 版本,但可能许多相同的问题会影响 Android 版本。很抱歉问了很多子问题,但它们似乎都相互关联,我认为最好将它们放在一起。

旁注:我的游戏不进行网络访问(在几个地方被称为耗电大)并且在后台不消耗大量电池;问题在于前台运行。

(1) 我知道有 API 可以读取电池电量,所以我可以做一些自动化测试。我的问题是:我需要多长时间(或者可能:消耗多少电池电量)才能让设备运行以获得可靠的读数?例如,如果它运行 10 分钟,那是否可靠?如果它耗尽了10%的电池,那可靠吗?还是运行一个小时左右更好(或者说,看看电池消耗 50% 需要多长时间)?我在这里要问的是电池表有多灵敏/可靠,所以我知道每次测试需要多长时间。

(2) 我试图了解高电池使用的可能原因是什么。下面我列出了一些可能的因素。请帮助我了解哪些是最可能的罪魁祸首:

(2a) 和很多游戏一样,我的游戏需要在每一帧上绘制全屏。它以大约 30 fps 的速度运行。我知道苹果公司说“只刷新你需要的屏幕”,但我几乎需要绘制每一帧。实际上,我可以做一些工作来仅绘制已更改的屏幕部分,但在我的情况下,这仍然是屏幕的大部分。无论如何,即使我可以将绘图本地化到屏幕的一部分,我仍然会每秒调用 30 次 OpenGL 交换缓冲区,所以我努力画得少一点真的很重要?

(2b) 当我绘制屏幕元素时,会进行一定数量的浮点数学运算(例如,在计算纹理 UV 坐标时),以及一些(较少的)双精度数学运算。与类似的整数运算相比,我不知道这些在电池方面有多昂贵。我可能会缓存很多这些值,而不必重复计算它们,如果那可能是胜利的话。

(2c) 我在渲染场景时做了一定量的纹理切换。我以前只担心这会使游戏变得太慢(它不会),但现在我也想知道减少纹理切换是否会减少电池使用。

(2d) 我不确定这对我来说是否实用,但是:我一直在阅读有关着色器和 OpenCL 的内容,我想了解是否要将一些 CPU 处理卸载到 GPU,这是否可能会节省电池(除了对于矢量类型的操作可能运行得更快)。或者它会在 GPU 上使用比 CPU 更多的电池吗?

我意识到我可以通过禁用游戏的某些部分并进行迭代电池测试运行来缩小哪些因素在起作用(因此是问题的第 (1) 部分)。只是禁用并非微不足道,并且有足够多的潜在罪魁祸首,我认为我会首先寻求一般性建议。

4

2 回答 2

2

一个真正帮助我降低电池使用量(以及设备温度!)的小技巧是在我的自定义 OpenGL 引擎中限制 FPS。

尤其是当场景是静态的(例如回合制游戏或用户点击暂停)时,会降低 FPS。如果用户超过 10 秒没有响应,或者像台式电脑上的屏幕保护程序一样,则进行节流。在现实世界中,用户在使用移动设备时经常会分心。当您的用户弄清楚他在哪个地铁站时,不要让您的应用程序耗尽电池;)

同样在 iPhone 上,有时 60FPS 是默认值,手动将其限制到 30 FPS 几乎看不到,并且可以保护您大约一半的 gpu 周期(因此需要大量电池!)。

于 2012-06-12T20:18:43.850 回答
2

尝试阅读这篇文章: 关于优化的 Android 文档

对我有用的是减少垃圾收集的使用,
例如在为台式计算机编程时,你(或我)习惯于在循环外不需要变量时定义循环内的变量,这会导致大量使用垃圾收集(我说的不是原始变量,而是大对象。

尽量避免这样的事情。

于 2012-04-22T14:32:22.997 回答