固定游戏更新周期

时间:2011-09-21 10:34:15

标签: game-loop

我已经在我的游戏循环中实现了增量时间,因此帧速率的任何波动都不再重要,但是游戏在更快的机器上运行速度更快,在慢速机器上运行速度更慢?

我的印象是,大多数游戏以固定速率(每秒60次)更新逻辑,然后执行尽可能多的渲染。如何使更新循环次数达到我想要的次数?

1 个答案:

答案 0 :(得分:1)

只需使用累加器...每次游戏循环运行时,+ =经过的时间增量。一旦该时间大于16.6666667秒,运行更新逻辑并从您的时间减去60秒。继续运行更新方法,直到累加器为< 60秒: - )

伪码!

const float updateFrequency = 16.6666667f;
float accumulator = updateFrequency;

public void GameLoop(float delta)
{
    // this gets called as fast as the CPU will allow.
    // assuming delta is milliseconds
    if (accumulator >= updateFrequency)
    {
        while (accumulator >= updateFrequency)
        {
             Update();
             accumulator -= updateFrequency;
        }
    }

    // you can call this as many times as you want
    Draw();

    accumulator += delta;
}

这种技术意味着如果绘制方法花费的时间比更新频率更长,它就会赶上来。当然,你必须要小心,因为如果你的绘制方法通常需要超过1/60秒,那么你将遇到麻烦,因为你总是必须在两次抽签之间多次调用更新,这可能会导致渲染中的打嗝。