限制游戏循环中的绘制处理

时间:2012-10-11 02:26:52

标签: java timer logic frame-rate game-loop

我在这里使用此代码结构http://www.koonsolo.com/news/dewitters-gameloop/ 设置一个游戏循环,根据设置的fps进行处理,但最多可以渲染/绘制。 如何在绘图fps上实现上限,以免耗尽所有处理能力/电池寿命。或限制它进行v-syncing。

const int TICKS_PER_SECOND = 60;
const int SKIP_TICKS = 1000000000 / TICKS_PER_SECOND;
const int MAX_FRAMESKIP = 5;

DWORD next_game_tick = GetTickCount();
int loops;
float interpolation;

bool game_is_running = true;
while( game_is_running ) {

    loops = 0;
    while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) {
        update_game();

        next_game_tick += SKIP_TICKS;
        loops++;
    }

    interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
                    / float( SKIP_TICKS );
    display_game( interpolation );
}

2 个答案:

答案 0 :(得分:2)

我假设您实际上正在进行适当的运动插值?否则,渲染速度比游戏更新速度更快:你只需要在完全相同的位置渲染所有对象。

我建议如下:

  • 拨打Thread.sleep(millis)电话以停止忙碌循环。可能Thread.sleep(5)很好,因为您只是要快速检查一下您是否准备好进行下一次更新。
  • display_game调用进行条件测试,以查看自上次display_game以来是否已经过了至少一定的毫秒数。例如,如果您使用10毫秒,那么您的帧速率将限制为100 FP。

您的代码中还有一些其他内容有点不清楚:

  • 什么是DWORD?这真的是Java吗?看起来像一些有趣的C / C ++转换?在Java中获取当前时间的常规方法是long time=System.nanoTime()或类似.....
  • 您使用的是什么图形框架?如果它是Swing,那么你需要注意你正在运行的线程,因为你不想阻止GUI线程....

最后,您还应该考虑是否要将更新循环与渲染代码分离,并让它们在不同的线程上运行。由于您可能需要锁定或拍摄某些对象的快照以确保它们在渲染时不会发生变化,因此这很难实现,但它将有助于您在多核计算机上的性能和可伸缩性(这些计算机中的大部分都是如此)时下!)

答案 1 :(得分:0)

我认为您可以更新display_game以将正在绘制的FPS与所需的限制进行比较。如果已达到该限制,您可以将等待时间等待时间添加为:

   Thread.sleep(500); //wait for 500 milliseconds