android - Android App 高 CPU 使用率和电池消耗
问题描述
一段时间以来,我一直在开发一款安卓游戏。我已经实现了基本游戏,所以现在我要回去尝试优化。对于我正在做的事情来说,电池消耗和 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){}
}
}
解决方案
没有延迟或节奏的循环因占用 CPU 和电池而臭名昭著。仔细考虑您是否真的需要连续处理,或者每帧一次,每任意时间间隔一次,或者每次发生某些外部事件时一次就足够了。尝试在循环中添加一个小的任意延迟,您可能会立即看到改进。
许多游戏使用主游戏循环。这是一个可搜索的术语。基本上,一个无限循环执行一些计算,绘制一个框架,然后通常会休眠一段时间。(请参阅SystemClock.sleep() 与 Thread.sleep()。)您的主循环可以将帧号和时间戳传递给代码的其余部分。你可以计算每帧移动物体的位置,但你可以做更复杂的事情,比如只在特定的时间间隔或帧更新敌人的 AI。如果你使用 Unity 之类的游戏引擎,主循环仍然存在,但不是你自己编写的。您只需编写它每帧调用的代码。
推荐阅读
- python - Heroku 上的“'/blog/' 处的编程错误”
- python - 在我的 Tkinter 应用程序中获取无效的命令名称
- regex - 正则表达式:在字符串中查找重复项
- node.js - 如何在节点js中加密流
- java - 编写一个将 Mute 实例作为参数并修改其状态以表明该类是可变的方法
- java - 使用流在java中映射和过滤对象集合的最佳实践
- python - 使用 mod_wsgi 在 Apache 上部署 Dash 应用程序
- java - 在 Apache Components HttpClient 中设置 cookie 但无法在 HttpServletRequest 中的服务器上检索
- python - 如何在python上使用opencv对齐和提取表单(jpeg)中的不同元素?
- python - 如何在Python中将数组数组转换为单个数组