Java 游戏循环说明



最近,我一直在研究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 以终止游戏的标志。

startelapsed用于测量循环中一轮所花费的时间。您正在等待不要使游戏运行得太快。如果您以设定的速度移动元素,那么让游戏循环运行得太快也会使它们移动得太快。这可能会导致糟糕的用户体验,因为用户可能不够快,无法玩游戏。

此外,如果没有等待,任何动画都无法再流畅运行。它会加速和减慢,具体取决于代码的执行速度。

只需继续学习本教程,当您在移动某些东西时,请删除等待,看看会发生什么。

编辑

该代码使循环中的一轮大约需要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();
        }
    }

最新更新