Android App高CPU使用率和电池消耗

时间:2018-11-18 23:39:17

标签: android cpu battery

我已经从事Android游戏已有一段时间了。我已经实现了基本游戏,所以现在我要回去尝试优化。似乎电池消耗和CPU使用率对于我正在执行的操作来说太高了。我实际上只有我的主线程,然后所有绘图和更新都是在单独的线程上完成的。

下面是进行更新和所有绘图的实际游戏线程的代码。所有实际的代码都已删除,剩下的就是我正在尝试找出异常的CPU使用率/电池消耗的实验。

因此,基本上,如果我仅使用无限的while循环启动以下线程,则该应用在使用30分钟后将消耗约315mAh或手机电池的9%。如果我在run方法中不使用代码启动线程,以使其在运行一次后失效,则在相同的时间内它会消耗大约70mAh或2%的手机电池电量。当线程运行并仅运行无限循环时,CPU使用率也从不运行线程的2%-3%跃升至大约14%-15%。

总而言之,好像只运行一个无限while循环的线程,什么也不做,在30分钟内将电池使用量增加了7%。我不知道这是怎么可能的,并认为我一定会丢失一些东西。我将继续努力解决这个问题,但是没有更多代码可以提取了。如果有人有任何建议或可以提供一些有关为什么发生这种情况的见解,我将不胜感激。预先感谢。

class InnerThread extends Thread
    {
        public InnerThread()
        {
            super();
        }

        public void run()
        {
           while(true){}
        }
    }

3 个答案:

答案 0 :(得分:1)

没有延迟或步调的循环因占用CPU和电池而臭名昭著。仔细考虑您是否真的需要连续处理,或者每帧一次,每个任意时间间隔一次还是每次外部事件发生一次就足够了。尝试在循环中添加一个小的任意延迟,您可能会立即看到改进。

许多游戏都使用主游戏循环。这是一个可搜索的术语。基本上,一个无限循环执行一些计算,绘制一个帧,然后通常休眠一段时间。 (请参阅SystemClock.sleep() vs. Thread.sleep()。)主循环可以将帧号和时间戳传递给其余代码。您可以每帧计算移动对象的位置,但是可以做更复杂的事情,例如仅在一定时间间隔或帧内更新敌人的AI。如果您使用Unity之类的游戏引擎,则主循环仍然存在,但您不必自己编写。您只需编写它调用每一帧的代码即可。

答案 1 :(得分:0)

while(true)是一个经典的无穷循环,在Java中可能不需要。

它甚至不在哪个线程上运行都很重要,它很可能会耗尽汁液。

请参阅Are "while(true)" loops so bad?

答案 2 :(得分:0)

我仔细检查并编辑了代码。利用thread.sleep限制整体绘制并将代码更新为每秒60帧。我还使用了Object.wait()和Object.notify()方法来减少不必要的线程处理。我看到了巨大的进步,感谢您的帮助,我非常感谢。我的问题绝对是我浪费了电池和CPU电源,却没有进行任何处理。