1

我从这里http://www.koonsolo.com/news/dewitters-gameloop/使用下面的代码结构 来设置一个游戏循环,该循环基于设置的 fps 进行处理,但尽可能渲染/绘制。如何在绘图 fps 上实施上限,以免耗尽所有处理能力/电池寿命。或将其限制为垂直同步。

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 );
}
4

2 回答 2

2

我假设你实际上是在做适当的运动插值?否则,渲染速度比游戏更新快是没有意义的:您只会在完全相同的位置再次渲染所有对象。

我建议如下:

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

您的代码中还有一些其他一些不清楚的地方:

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

最后,您还应该考虑是否要将更新循环与渲染代码分离,并让它们在不同的线程上运行。正确处理这件事比较棘手,因为您可能需要锁定某些对象或拍摄某些对象的快照,以确保在渲染它们时它们不会发生变化,但这将有助于您在多核机器上的性能和可伸缩性(其中大多数是如今!)

于 2012-10-11T03:00:31.650 回答
0

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

   Thread.sleep(500); //wait for 500 milliseconds
于 2012-10-11T02:34:37.800 回答