我正在用Java编写游戏。我有游戏中的教程。每个教程基本上都是一个5-10帧的动画,每秒都在变化。
对于每个教程,我都有一个简单的线程运行:
int sleepTimeMillis = 1000;
public static void run() {
while ( true ) {
try {
tutorialFrame = ( tutorialFrame + 1 ) % numberOfFrames;
Thread.sleep ( sleepTimeMillis );
catch ( InterruptedException e ) {}
}
}
我目前有大约10个正在运行。当我完成所有这些时,我想我将有大约50岁。
否则,我的游戏使用了一些线程:一个用于窗口环境,一个用于游戏逻辑,一个用于渲染引擎,可能还有一些其他小的线程。
不出所料,我没有通过添加这些线程注意到游戏中的任何速度问题。话虽这么说,我对在流程中拥有多个线程的幕后开销并不了解。
如果希望减少这些教程线程的数量,我可以用不同的方式重构程序。
所以我问是否值得花时间重新构建教程,以便他们共享一个帖子,或者只是留下它们是如何有意义的。
谢谢!
答案 0 :(得分:3)
线程很棘手。人们第一次学习线程概念,他们认为:“太棒了,现在我可以并行运行所有东西!我会尽可能地在所有地方使用线程!”。但是有一些陷阱。让我们从具有多个核心的CPU
开始。对于第一个近似值,可以同时运行的线程数等于核心数(欢迎使用详细注释,如hyperthreading)。因此,如果您创建了100个线程,则只能在具有4个核心的计算机上同时执行4个线程。并且有一个线程调度程序,它调度线程以便执行。
线程调度程序从一个线程到另一个线程提供CPU
时间的过程称为context switch并且需要一些时间。而且,当您创建一个新线程时,您为其堆栈分配了一些内存。考虑到这一点,有很多(比如50个)线程是坏的,因为:
x64
机器上,默认线程堆栈大小为1MB
。 50个帖子= 50 MB
。context switch
发生得太频繁,你正在浪费时间。你最终会拥有许多线程,大部分时间都不会做任何事情,只会浪费资源。那么,解决方案是什么?每次需要异步执行某个任务时,您可以使用ExecutorService
,而不是创建新的线程,有一个很好的article。此外,查看您的代码,看起来您正在执行循环任务。如果是,您可以使用Timer课程,只需创建TimerTask和schedule it at fixed rate。
答案 1 :(得分:0)
将教程作为精灵并使用Sprites Update和绘制方法会更有效。这样你只使用一个线程来更新所有内容。拥有多个线程的工作是浪费。