2012-07-20 138 views
0

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

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

  2. 如果是关注点;通用编码实践或设计模式是什么,以避免利用率的巨大飞跃(除了没有多线程)?

+1

它什么都不做的线程可以不占用CPU资源的50%。你有没有试图分析你的代码? – Edmondo1984 2012-07-20 18:35:13

回答

1

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

大多数游戏引擎都有一个称为每秒60次的游戏逻辑更新功能,并且一个绘图函数在计算机有资源(但不超过逻辑更新)的情况下经常调用。

一般的编码习惯这里是你不想更新比你需要的游戏。试着在你的主循环中放一个计数器,并在10秒内看到它被调用了多少次?如果每秒运行60多个更新,则不需要此CPU负担!

看起来你不使用的游戏引擎,让你这个,所以你可以砍在一起的解决方案:有你的主while循环查找当前时间(Java的DateTime为您提供精确到毫秒,whcih是不够好)然后将它与最后一个循环的更新时间进行比较。如果没有足够的时间,请在游戏等待运行下一次迭代时使用Thread.sleep()来减轻CPU的负担!

最后一个评论:

(比没有多线程等)

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

0

我会CPU和内存配置文件的应用程序,看看它在做什么来提高效率。

1

这里的答案是衡量你的程序,并看到CPU正在使用如何你期望它。几率是你会发现一些令人惊讶的,当你测量它。市场上有很多好的Java分析器来做到这一点。我使用JProfiler,我很满意。一个穷人的方法是使用pstack获取Java线程转储。做几个转储,看看它在做什么。或者只是在IDE中进行调试并在各个点上进行中断。

3

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

无所事事可以占用整个CPU,例如,这段代码

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

    } 
    } 

显示我PC上的CPU使用率为100%。所以虽然你的'简单'游戏可能不会有很多,但如果执行得不好,它肯定会占用大量的CPU能力。

使用性能分析工具(如JProfiler)可以真正帮助您确定所有CPU将要运行的位置。不确定是否有免费的分析器。但是,像JConsoleVisualVM(通常都包含在JDK)免费工具也可以是有用的快速查看哪些Thread s为活跃,占据了大部分的CPU

+0

我喜欢在我的程序的情况......我还以为是在游戏中的标准有一个“游戏循环”调用子程序,直到比赛赢或输的游戏条件满足。这是不对的?也许我应该把它移到游戏开发中。现场。 – PinkElephantsOnParade 2012-07-20 18:57:27

+0

我不是一个游戏开发商,但我想你只需要运行在特定的时间循环,而不是所有的定时器(例如像(http://stackoverflow.com [动画可以通过使用'Timer'完成] /问题/ 9849950 /东西,似乎-错用最布局的JButton-显示,意外性的行为在-R)) – Robin 2012-07-20 19:04:07

+0

我提出这样的问题到gamedev堆栈交换。不过感谢程序员的方法! – PinkElephantsOnParade 2012-07-20 20:18:28

1

的最好的方式找到CPU & memoryutilization ...是使用分析器 如JConsole的或jvisualvm ..

你可以找到同样在你的JDK

C:〜/ JDK /斌/ JConsole的或C:〜/ JDK /斌/ jvisualvm

当CPU峰值变高时,将采用相应的堆栈帧。 您将能够看到当前正在执行的线路,其中有更多CPU正在使用。

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