我在用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个。
否则,我的游戏就会使用一些线程:一个用于窗口环境,一个用于游戏逻辑,一个用于呈现引擎,可能还有一些其他的小线程。
毫不奇怪,我没有注意到任何速度问题在游戏中添加这些线程。话虽如此,我对进程中有许多线程的幕后开销并不了解。
如果希望减少这些教程线程的数量,我可以以不同的方式重构程序。
所以,我想问的是,是否值得花点时间来重新构建教程,让它们都共享一个线程,还是只保留它们的原样是否有意义。
谢谢!
发布于 2015-04-22 18:44:40
线是很棘手的。当人们第一次学习线程概念时,他们想:“太棒了,现在我可以并行运行所有的东西了!我将尽可能多地使用线程!”但也有陷阱。让我们从CPU
开始,它有多个核。首先,可以同时运行的线程数量等于内核的数量(欢迎对此进行详细评论,如超线程 )。因此,如果您创建了100个线程,那么只有4个可以同时在具有4个内核的机器上执行。还有一个线程调度器,它为执行安排线程。
当线程调度程序给CPU
从一个线程到另一个线程的时间时,这个进程称为上下文切换,它需要一些时间。此外,当您创建一个新线程时,您会为其堆栈分配一些内存。考虑到这一点,有许多线程(比如50个线程)是不好的,因为:
x64
机器上,默认的线程堆栈大小是1MB
。50个线程= 50 MB
。context switch
发生得太频繁了,您正在浪费时间。最后会有很多线程,大多数时候什么都不做,只会浪费资源。那么,解决办法是什么?与每次需要异步执行某些任务时创建新线程不同,您可以使用ExecutorService
,这上面有一个很好的文章。此外,看看您的代码,它看起来就像是在执行重复的任务。如果是这样,您可以使用计时类,只需创建TimerTask和按固定费率安排。
发布于 2015-04-22 16:30:51
让您的教程成为精灵并使用sprites更新和绘图方法更有效。这样,您只需要使用一个线程来更新所有内容。多用一根线做这项工作是一种浪费。
https://stackoverflow.com/questions/29803593
复制相似问题