为什么 gameloops 渲染的次数比更新的次数多

Why gameloops render more times than updating

许多游戏循环使用 tick 和渲染,当 tick 每 X ms 完成一次并尽可能渲染时。为什么不勾选然后渲染? 在我看来,渲染器会在刻度线之间绘制相同的东西,那么为什么要多次调用它呢? (如果不明白请解释原因)

典型的游戏循环是:

public void run() {

        long lastTime = System.nanoTime();
        double amountOfTicks = 60.0;
        double nsBetweenTicks = 1000000000 / amountOfTicks;
        double delta = 0;
        long timer = System.currentTimeMillis();
        while(running){
            long now = System.nanoTime();
            delta += (now - lastTime) / nsBetweenTicks;
            lastTime = now;
            while(delta >=1){
                tick();
                delta--;
            }
            render();
       }
}

我的问题是为什么不:

public void run() {

        long lastTime = System.nanoTime();
        double amountOfTicks = 60.0;
        double nsBetweenTicks = 1000000000 / amountOfTicks;
        double delta = 0;
        long timer = System.currentTimeMillis();
        while(running){
            long now = System.nanoTime();
            delta += (now - lastTime) / nsBetweenTicks;
            lastTime = now;
            while(delta >=1){
                tick();
                render();
                delta--;
            }
       }
}

游戏逻辑不应与帧速率相关联。

有些游戏不使用每秒 60 个滴答,有些游戏(如 Minecraft)运行 使用每秒 20 个滴答。这将有效地将游戏锁定在 20 fps。

即使所有游戏 运行 都是每秒 60 滴答,如果有人拥有 144 Hz 显示器怎么办?他会被困在 60 fps 的速度上。

如果你渲染游戏的频率比 ticks 更频繁,你仍然可以 运行 动画和渲染逻辑中的其他东西,而游戏逻辑必须停止多长时间,使游戏即使它的滴答频率比显示器的刷新率慢,也很流畅。

tick 和 render 方法有什么作用?

  1. Tick(或更新,但我更喜欢tick)方法只是更新游戏对象的状态。例如更新玩家坐标、处理输入、检查当前状态(菜单、游戏、暂停)并更新等等。
  2. Render 方法只是将它绘制到屏幕上。就像画家凭感觉画东西一样。但在我们的案例中,他基于一些变量和其他信息。

他们是如何工作的?

  1. Tick 方法每秒更新特定次数(例如,20、60 等)。我称这个号码为 UPS(代表每秒更新)。让我们考虑玩家的移动。他的速度是每秒 20 个像素。因此,如果我们想以这种速度移动我们的播放器,我们需要了解 UPS。例如,UPS 是 20。因此我们的播放器每刻移动 20 个像素。这是错误的。如果是,那么我们的 20 个刻度,我们的玩家将在 1 秒内移动 20*20 像素(每秒 400 像素)。所以我们玩家的速度将为每刻 20 * (1 / UPS)。我们可以更改我们的 UPS,玩家每次移动的像素数也会更改。但他仍将以每秒 20 像素的速度移动。为了清楚起见,假设我们的 UPS 是 1,这意味着每秒一个滴答声。那么速度将是 20 * (1 / 1) = 20 像素/刻度(一秒是一个刻度)= 30 像素/秒。和我们想要的一样。
  2. Render 只是绘制我们更新的内容。它可以以与我们更新相同的速度完成,我也可以更快地完成。但这没关系,因为我们只会看到我们更新的内容。 UPS 可以是 1 但 FPS 是 160。你会看到一切都在每秒移动。但这并不意味着我们每秒渲染 1 次,它意味着在一秒钟内我们渲染同一张图片。 1 秒后我们更新我们的游戏,我们将看到另一张图片。

并回答您的问题,您可以同时使用 tick() 和 render()。