最近,我一直在进入Java游戏编程。我以前学过Java,但这是我第一次使用Graphics,Game Loops等。
我关注了游戏循环的this教程,它运行得很好。
它没有任何问题,但我无法弄清楚为什么我会使用thread.sleeping代码,以及它的重点。
如果有人能解释开始,经过和正在进行的操作,以及我为什么要做thread.sleep(等待)那么我会非常感激!
游戏循环(记住,它有效,我只是不知道为什么):
while (running) {
start = System.nanoTime();
update();
draw();
drawToScreen();
elapsed = System.nanoTime() - start;
wait = targetTime - elapsed / 1000000;
if (wait < 0) {
wait = 5;
}
try {
Thread.sleep(wait);
} catch (Exception e) {
Game.logger.log("ERROR! Printing Stacktrace...");
e.printStackTrace();
}
}
}
答案 0 :(得分:3)
嗯,running
是一个可以设置为false的标志来终止游戏。
start
和elapsed
用于衡量循环中一轮的时间。你等着不让游戏跑得太快。如果您以设定的速度移动元素,那么游戏循环运行得太快会使它们移动得太快。这可能会导致糟糕的用户体验,因为用户可能没有足够快的速度来玩游戏。
此外,任何动画都不会在没有等待的情况下顺畅运行。根据代码的执行速度,它会加速和减速。
继续阅读教程,当你做出移动的时候,移除等待,看看会发生什么。
修改强>
代码在循环中进行一轮约targetTime
。它的单位是毫秒。因此,要计算帧速率,只需除以1000 / targetTime
。
答案 1 :(得分:1)
看起来代码的目标是执行targetTime秒。所以你计算已经过了多少时间(已经过去),然后计算要等多少(将它除以得到你的剩余时间,以毫秒为单位,甲基眠睡眠所需的时间(等待))。
这种等待的一个目的通常是在重新绘制屏幕之间花费一些时间。
要获得您的FPS,一种方法是略微更改您的代码:
long prevStart = 0; //just initialize. First FPS is of course wrong, next get fine.
double FPS = 0;
while (running) {
start = System.nanoTime();
FPS = 1 / double(start - prevStart);
prevStart = start;
update();
draw();
drawToScreen();
elapsed = System.nanoTime() - start;
wait = targetTime - elapsed / 1000000;
if (wait < 0) {
wait = 5;
}
try {
Thread.sleep(wait);
} catch (Exception e) {
Game.logger.log("ERROR! Printing Stacktrace...");
e.printStackTrace();
}
}
答案 2 :(得分:1)
start
是游戏逻辑运行之前的时间。 elapsed
是游戏逻辑运行所需的时间。 running
是一个布尔(true / false)变量,用于确定游戏是否应该继续。 Thread.sleep(wait)
是一种延迟一段时间的方法。
目标是通过延迟来保持帧之间的时间量大致保持不变,以便动画不会运行得更快或更慢,具体取决于计算机处理器的运行速度。