我编写了一个非常简单的 Java 2D 游戏,只有两个线程——音乐播放器和游戏。我注意到当我开始游戏时,我的 CPU 使用率从 20% 上升到 70%。我想要在游戏中进行的很多处理甚至还没有实现!
这是一个问题吗?- 一个简单的游戏不应该占用这么多CPU吗?
如果这是一个问题;什么是通用编码实践或设计模式来避免利用率的巨大飞跃(除了没有多线程)?
我编写了一个非常简单的 Java 2D 游戏,只有两个线程——音乐播放器和游戏。我注意到当我开始游戏时,我的 CPU 使用率从 20% 上升到 70%。我想要在游戏中进行的很多处理甚至还没有实现!
这是一个问题吗?- 一个简单的游戏不应该占用这么多CPU吗?
如果这是一个问题;什么是通用编码实践或设计模式来避免利用率的巨大飞跃(除了没有多线程)?
这是一个问题吗?- 一个简单的游戏不应该占用这么多CPU吗?
什么都不做可能会占用你的整个 CPU,例如这段代码
public static void main( String[] args ) {
while( true ){
}
}
在我的电脑上显示 100% 的 CPU 使用率。因此,尽管您的“简单”游戏可能不会做很多事情,但如果实施不当,它肯定会使用大量的 CPU 资源。
使用分析工具(如 JProfiler)可以真正帮助您确定所有 CPU 的去向。不确定是否也有免费的分析器可用。但是JConsole和VisualVM等免费工具(通常都包含在 JDK 中)也可以用于快速查看哪些Thread
s 处于活动状态并占用大部分 CPU
如果这是一个问题;什么是通用的编码实践或设计模式来避免利用率的巨大飞跃(除了没有多线程)?
大多数游戏引擎都有一个每秒调用 60 次的游戏逻辑更新函数,以及一个在计算机有资源时调用的绘图函数(但不超过逻辑更新)。
此处的一般编码实践是,您不想更新游戏超出您的需要。试着在你的主循环中放置一个计数器,看看它在 10 秒内被调用了多少次?如果您每秒运行超过 60 次更新,则不需要这种 CPU 负担!
看起来您没有使用可以提供此功能的游戏引擎,因此您可以拼凑出一个解决方案:让您的主while
循环找到当前时间(JavaDateTime
为您提供毫秒精度,这已经足够好了),然后将其与最后一个循环的更新时间。如果没有足够的时间过去,Thread.sleep()
请在游戏等待运行下一次迭代时减轻 CPU 的负担!
最后一条评论:
(除了没有多线程)
虽然让 CPU 切换线程会导致一些开销,但我不认为使用许多编写良好的线程应该会使 CPU 更努力地工作(我假设工作的总和与更少的线程相同)。事实上,如果你的机器是多核的,如果有一部分需要 CPU,它会让你的游戏运行得更快(假设你的线程是并发的,而不是相互阻塞)!
查找 CPU 和内存利用率的最佳方法是使用分析器,例如 jconsole 或 jvisualvm 。
你可以在你的jdk中找到相同的
C:~/jdk/bin/jconsole 或 C:~/jdk/bin/jvisualvm
当 CPU 峰值变高时,它会占用相应的堆栈帧。您将能够看到当前正在执行的行,其中更多的 CPU 被利用。
确保您分析您的应用程序并对线程数进行基准测试。
这里的答案是测量您的程序并查看 CPU 的使用情况是否符合您的预期。当你测量它时,你可能会发现一些令人惊讶的东西。市场上有许多优秀的 Java 分析器可以做到这一点。我使用我非常满意的 JProfiler。穷人的做法是使用 pstack 获取 Java 线程转储。进行几次转储,看看它在做什么。或者只是在 IDE 中调试它并在各个点中断它。
我会对您的应用程序进行 CPU 和内存分析,以查看它正在做什么来提高效率。