问题描述
我正在研究一款基于键盘输入来移动汽车图像的游戏。目前,我正在使用以下游戏循环:
private void runGameLoop() {
window.setVisible();
isRunning = true;
final double FRAMES_PER_SECOND = 60;
double timePerUpdate = 1000000000 / FRAMES_PER_SECOND;
double timeFromLastUpdate = 0;
long Now;
long last = System.nanoTime();
while (isRunning) {
Now = System.nanoTime();
timeFromLastUpdate += (Now - last) / timePerUpdate;
last = Now;
if(timeFromLastUpdate >= 1) {
tick();
render();
timeFromLastUpdate--;
}
}
}
tick方法更新汽车图像的位置,然后render方法将在屏幕上渲染图像(具有新位置)。 我想将新图像位置的计算放在单独的线程上,因为此刻计算需要花费很长时间并且会导致渲染滞后。有没有办法在仍然实现游戏循环的同时使用多线程? 预先感谢。
解决方法
Perhpas,您可以执行与Android类似的操作。在Android中,有一个主线程,就像您的游戏循环一样。它具有用于可运行对象的处理程序,该可处理对象从后台/并发线程发布到主线程。
因此,在每个循环周期中,主线程都会执行由feom后台线程发布的所有可运行对象。
请注意,不应在可运行对象(在主线程中执行)中进行计算,而只能在可运行对象中传递结果/更新内容。