您应该将游戏帧与图形帧分开。图形框架应该只显示图形,没有别的。对于重播,无论您的计算机能够执行多少图形帧(每秒 30 帧还是每秒 1000 帧)都无关紧要,重播计算机可能会以不同的图形帧速率重播它。
但是您确实应该修复游戏框架。例如每秒 100 个游戏帧。在游戏框架中执行游戏逻辑:与您的游戏(和重播)相关的内容。
只要不需要游戏帧,您的游戏循环就应该执行图形帧,因此,如果您将游戏固定为每秒 100 个游戏帧,则每个游戏帧为 0.01 秒。如果您的计算机只需要 0.001 秒即可在游戏帧中执行该逻辑,那么剩下的 0.009 秒用于重复图形帧。
这是一个小但不完整且不是 100% 准确的示例:
uint16_t const GAME_FRAMERATE = 100;
uint16_t const SKIP_TICKS = 1000 / GAME_FRAMERATE;
uint16_t next_game_tick;
Timer sinceLoopStarted = Timer(); // Millisecond timer starting at 0
unsigned long next_game_tick = sinceLoopStarted.getMilliseconds();
while (gameIsRunning)
{
//! Game Frames
while (sinceLoopStarted.getMilliseconds() > next_game_tick)
{
executeGamelogic();
next_game_tick += SKIP_TICKS;
}
//! Graphical Frames
render();
}
以下链接包含有关创建准确游戏循环的非常好的和完整的信息:
http://www.koonsolo.com/news/dewitters-gameloop/