Java游戏循环解释

时间:2013-12-24 00:10:30

标签: java multithreading game-loop

最近,我一直在进入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();
        }

    }

}

3 个答案:

答案 0 :(得分:3)

嗯,running是一个可以设置为false的标志来终止游戏。

startelapsed用于衡量循环中一轮的时间。你等着不让游戏跑得太快。如果您以设定的速度移动元素,那么游戏循环运行得太快会使它们移动得太快。这可能会导致糟糕的用户体验,因为用户可能没有足够快的速度来玩游戏。

此外,任何动画都不会在没有等待的情况下顺畅运行。根据代码的执行速度,它会加速和减速。

继续阅读教程,当你做出移动的时候,移除等待,看看会发生什么。

修改

代码在循环中进行一轮约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)是一种延迟一段时间的方法。

目标是通过延迟来保持帧之间的时间量大致保持不变,以便动画不会运行得更快或更慢,具体取决于计算机处理器的运行速度。