0

我编写了一个非常简单的 Java 2D 游戏,只有两个线程——音乐播放器和游戏。我注意到当我开始游戏时,我的 CPU 使用率从 20% 上升到 70%。我想要在游戏中进行的很多处理甚至还没有实现!

  1. 这是一个问题吗?- 一个简单的游戏不应该占用这么多CPU吗?

  2. 如果这是一个问题;什么是通用编码实践或设计模式来避免利用率的巨大飞跃(除了没有多线程)?

4

5 回答 5

3

这是一个问题吗?- 一个简单的游戏不应该占用这么多CPU吗?

什么都不做可能会占用你的整个 CPU,例如这段代码

  public static void main( String[] args ) {
    while( true ){

    }
  }

在我的电脑上显示 100% 的 CPU 使用率。因此,尽管您的“简单”游戏可能不会做很多事情,但如果实施不当,它肯定会使用大量的 CPU 资源。

使用分析工具(如 JProfiler)可以真正帮助您确定所有 CPU 的去向。不确定是否也有免费的分析器可用。但是JConsoleVisualVM等免费工具(通常都包含在 JDK 中)也可以用于快速查看哪些Threads 处于活动状态并占用大部分 CPU

于 2012-07-20T18:54:02.287 回答
2

如果这是一个问题;什么是通用的编码实践或设计模式来避免利用率的巨大飞跃(除了没有多线程)?

大多数游戏引擎都有一个每秒调用 60 次的游戏逻辑更新函数,以及一个在计算机有资源时调用的绘图函数(但不超过逻辑更新)。

此处的一般编码实践是,您不想更新游戏超出您的需要。试着在你的主循环中放置一个计数器,看看它在 10 秒内被调用了多少次?如果您每秒运行超过 60 次更新,则不需要这种 CPU 负担!

看起来您没有使用可以提供此功能的游戏引擎,因此您可以拼凑出一个解决方案:让您的主while循环找到当前时间(JavaDateTime为您提供毫秒精度,这已经足够好了),然后将其与最后一个循环的更新时间。如果没有足够的时间过去,Thread.sleep()请在游戏等待运行下一次迭代时减轻 CPU 的负担!

最后一条评论:

(除了没有多线程)

虽然让 CPU 切换线程会导致一些开销,但我不认为使用许多编写良好的线程应该会使 CPU 更努力地工作(我假设工作的总和与更少的线程相同)。事实上,如果你的机器是多核的,如果有一部分需要 CPU,它会让你的游戏运行得更快(假设你的线程是并发的,而不是相互阻塞)!

于 2012-07-20T20:25:24.463 回答
1

查找 CPU 和内存利用率的最佳方法是使用分析器,例如 jconsole 或 jvisualvm 。

你可以在你的jdk中找到相同的

C:~/jdk/bin/jconsole 或 C:~/jdk/bin/jvisualvm

当 CPU 峰值变高时,它会占用相应的堆栈帧。您将能够看到当前正在执行的行,其中更多的 CPU 被利用。

确保您分析您的应用程序并对线程数进行基准测试。

于 2012-07-20T19:53:10.387 回答
1

这里的答案是测量您的程序并查看 CPU 的使用情况是否符合您的预期。当你测量它时,你可能会发现一些令人惊讶的东西。市场上有许多优秀的 Java 分析器可以做到这一点。我使用我非常满意的 JProfiler。穷人的做法是使用 pstack 获取 Java 线程转储。进行几次转储,看看它在做什么。或者只是在 IDE 中调试它并在各个点中断它。

于 2012-07-20T18:32:27.023 回答
0

我会对您的应用程序进行 CPU 和内存分析,以查看它正在做什么来提高效率。

于 2012-07-20T18:32:25.530 回答