将游戏线程和显示线程分开是好的吗?

时间:2014-04-06 19:19:55

标签: java multithreading concurrency

这是我第一次想写一个java游戏,我选择了做一个Snake Line。

我从在线的一段源代码中学到了东西。它更新游戏状态并在一个线程中显示。我改变了代码,当我改变FPS(从60改为30)时,动画变慢了。更重要的是,游戏行为也发生了变化。这是鸭子射击游戏,鸭子之间的空间越来越窄。

所以我决定将游戏线程和显示线程分开来避免上述问题。但后来我意识到它会带来并发问题,这些问题将会到处发生。

正如标题所示,分开游戏线程和显示线程是否合适?通常的做法是什么?为什么?

1 个答案:

答案 0 :(得分:1)

根据您的体验变化,听起来您正在使用 frame 作为时间测量单位。或者,更确切地说,你使用像素/帧(或类似的东西)来获得速度,并使用 second 来获得时间。

这对于像你这样的简单游戏来说可能没问题,这些游戏在系统资源上足够轻,这样你在代码中指定的帧之间的延迟几乎与实际延迟相同,这意味着你可以完全控制FPS。当游戏变得越来越重,现代系统无法再保证财产时,你就会遇到问题。

解决方案通常不是将游戏和显示循环分离为单独的线程,而是不使用框架作为游戏机制计算的度量单位。相反,每个帧测量前一帧的时间并将该值用于计算,例如。将其乘以速度,以了解在此框架中移动游戏对象的程度。

不是将这些循环分开是一个坏主意。你不会“到处都是”并发问题,因为游戏逻辑和显示之间的交互不应该“遍布整个地方”。交互应该是单向的:游戏循环写入数据,显示循环读取数据。这意味着您不应该有竞争条件,但仍然可以获得other multithreading hazards,您可以使用volatile变量来解决这些问题。