最近,我一直在研究Java游戏编程。我以前学过Java,但这是我第一次使用图形,游戏循环等。
我按照本教程进行了游戏循环,它运行良好。
它没有任何问题,但我只是无法弄清楚为什么我要线程睡眠代码,以及它的意义何在。
如果有人能解释一下开始,经过和运行做什么,以及我为什么要做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();
}
}
}
好吧,running
是一个可以设置为 false 以终止游戏的标志。
start
和elapsed
用于测量循环中一轮所花费的时间。您正在等待不要使游戏运行得太快。如果您以设定的速度移动元素,那么让游戏循环运行得太快也会使它们移动得太快。这可能会导致糟糕的用户体验,因为用户可能不够快,无法玩游戏。
此外,如果没有等待,任何动画都无法再流畅运行。它会加速和减慢,具体取决于代码的执行速度。
只需继续学习本教程,当您在移动某些东西时,请删除等待,看看会发生什么。
编辑
该代码使循环中的一轮大约需要targetTime
。它的单位是毫秒。因此,要计算帧速率,只需除以1000 / targetTime
。
start
是游戏逻辑运行之前的时间。 elapsed
是游戏逻辑运行所需的时间。 running
是一个布尔(真/假)变量,用于确定游戏是否应继续。 Thread.sleep(wait)
是一种延迟一定时间的方法。
目标是通过延迟使帧之间的时间量大致保持不变,以便动画不会根据计算机处理器的运行速度而运行得更快或更慢。
看起来代码旨在执行目标时间秒。因此,您计算已经过去了多少时间(经过),然后计算要等待多少时间(将其除以毫秒为单位获得梅森睡眠(等待)所需的剩余时间)。
这种等待的一个目的通常是在重新绘制到屏幕上之间留出一些时间。
要获得您的 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();
}
}