Android 应用高 cpu 使用率和电池消耗

Android App high cpu usage and battery drain

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

下面是执行更新和所有绘图的实际游戏线程的代码。所有实际代码都已删除,剩下的是我一直在尝试找出异常 CPU usage/battery 流失的代码。

所以基本上,如果我仅使用无限 while 循环启动下面的线程,应用程序在使用 30 分钟后会使用大约 315mAh 或我的 phones 电池的大约 9%。如果我在 运行 方法内没有代码的情况下启动线程,以便它在一个 运行 之后过期,它会在相同的时间内使用大约 70mAh 或 phone 电池的 2%。 CPU 使用率也从没有线程 运行 的 2%-3% 跃升至大约 14%-15%,当线程 运行ning 和 运行ning 无限循环时。

总而言之,似乎 运行 仅使用一个无限 while 循环来连接线程,这什么都不做,在 30 分钟内电池使用量增加了 7%。我不明白这是怎么可能的,我想我一定是遗漏了什么。我会继续努力解决这个问题,但是没有更多的代码可以删除了。如果有人有任何建议或可以提供一些关于为什么会发生这种情况的见解,我将不胜感激。提前致谢。

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

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

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

它甚至在哪个线程上运行都没有关系,它很可能会耗尽精力。

Are "while(true)" loops so bad?

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

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

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