【问题标题】:Limit draw processing in a game loop限制游戏循环中的绘制处理
【发布时间】:2012-10-11 02:26:51
【问题描述】:

我正在使用下面的代码结构 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 );
}

【问题讨论】:

  • 我假设您的 int TICKS_PER_SECOND 是设置的帧速率。你为什么不尝试降低这个数字?
  • 那是逻辑循环,它设置为 60,但“display_game”函数被尽可能频繁地调用,如果没有太多,则经常绘制超过 1000 fps,以便始终最大化处理器(在任务管理器上持续 98-99%)

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


【解决方案1】:

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

我建议如下:

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

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

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

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

【讨论】:

  • 对不起,代码是从上面的链接中获取的(它实际上只是伪代码) dword 只是双精度,由于插值,它们不会在同一个地方绘制,我正在使用 libgdx 框架,它正在使用opengl 编辑:小睡眠确实有效,我只是认为这可能很草率,但它似乎工作得很好。
  • 睡眠工作正常,但现在我的睡眠从长远来看可能会损害逻辑循环的周期。条件似乎更合乎逻辑,就像逻辑循环一样,但由于某种原因,它会导致非常奇怪的橡皮筋和抽搐。我在玩它,但它似乎不太好用
  • 您确定您仍然使用从更新循环派生的刻度进行插值吗?如果您切换到使用显示循环刻度来计算插值,那么您肯定会得到奇怪的行为.....
  • 是的,尝试了有无我最终使用了一个组合它。
【解决方案2】:

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

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

【讨论】:

  • 虽然睡眠有效,但将其与 fps 进行比较会极大地损害游戏流程。
  • 我的意思是将 fps 与恒定限制 (int) 进行比较。您是说 int 的一个加法比较语句会增加这么多开销吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多