Java游戏循环说明

Java游戏循环说明,java,multithreading,game-loop,Java,Multithreading,Game Loop,最近,我开始接触Java游戏编程。我以前学过Java,但这是我第一次学习图形、游戏循环等 我按照教程做了一个游戏循环,效果很好 这并没有什么问题,但我就是搞不懂为什么我要在线程中休眠代码,这又有什么意义 如果有人能解释一下启动、运行和运行的功能,以及我为什么要执行thread.sleep(等等),我将非常感激 游戏循环(记住,它是有效的,我只是不知道为什么): 运行时{ start=System.nanoTime(); 更新(); draw(); drawToScreen(); 已用=Syste

最近,我开始接触Java游戏编程。我以前学过Java,但这是我第一次学习图形、游戏循环等

我按照教程做了一个游戏循环,效果很好

这并没有什么问题,但我就是搞不懂为什么我要在线程中休眠代码,这又有什么意义

如果有人能解释一下启动、运行和运行的功能,以及我为什么要执行thread.sleep(等等),我将非常感激

游戏循环(记住,它是有效的,我只是不知道为什么):

运行时{
start=System.nanoTime();
更新();
draw();
drawToScreen();
已用=System.nanoTime()-开始;
等待=targetTime-已用时间/1000000;
如果(等待<0){
等待=5;
}
试一试{
线程。睡眠(等待);
}捕获(例外e){
Game.logger.log(“错误!打印堆栈跟踪…”);
e、 printStackTrace();
}
}
}

似乎代码的目标是在目标时间秒内执行。所以你要计算已经过去了多少时间,然后计算要等待多少时间(除以它得到你的剩余时间,单位为毫秒,这是methon睡眠(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();
        }

    }
long prevStart=0//只需初始化。第一个FPS当然是错误的,下一个得到罚款。
双FPS=0;
(跑步时){
start=System.nanoTime();
FPS=1/双(启动-预启动);
prevStart=开始;
更新();
draw();
drawToScreen();
已用=System.nanoTime()-开始;
等待=targetTime-已用时间/1000000;
如果(等待<0){
等待=5;
}
试一试{
线程。睡眠(等待);
}捕获(例外e){
Game.logger.log(“错误!打印堆栈跟踪…”);
e、 printStackTrace();
}
}

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

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

此外,如果没有等待,任何动画都不会再平滑运行。它将根据代码的执行速度来加速和减慢

只要继续学习教程,当你在某个点上移动某个东西时,去掉等待,看看会发生什么

编辑


代码使循环中的一轮大约花费
targetTime
。它的单位是毫秒。因此,要计算帧速率,只需除以
1000/targetTime

start
就是游戏逻辑运行之前的时间
Appead
是运行游戏逻辑所需的时间量
running
是一个布尔(真/假)变量,用于确定游戏是否应继续<代码>线程。睡眠(等待)是一种延迟一定时间的方法


我们的目标是通过延迟来保持帧间的时间大致恒定,这样动画就不会根据计算机处理器的运行速度而变快或变慢。

好的,我明白了。但我该如何计算其中的FPS呢?我明白,但我该如何计算FPS呢?这只是targetTime吗?为什么要计算FPS?你可以用一秒除以目标时间,多多少少。这样我就可以记录下来,如果有什么东西让游戏变慢了,我可以找到它。如果你有你的targetTime,这是你希望这部分代码运行的时间,然后用秒除以它+执行时间,得到FPS的近似值(因为这是调用重新绘制方法的次数)。或者,您可以测量代码“精确”执行所需的时间(store System.nanoTime()产生一些变量,并在下一个循环中从当前System.nanoTime()中减去它),然后1秒/结果就是FPS.Hm。只是增加一个变量并每秒打印/重置它,或者减去System.nanoTime,效率会更高吗?你能告诉我你在代码里说了些什么吗?因为这有点难理解。
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();
        }

    }