固定与可变的游戏帧速率:什么是最好的,什么时候?

Ped*_*dro 8 frame-rate

经过一段时间的开发游戏,我已经接触到两种可变帧速率(你可以计算出自上次刻度以来已经过了多少时间并相应地更新了演员的运动)和固定的帧速率(你可以计算出多少时间)已经通过并选择要么勾选一段固定的时间,要么一直睡到下一个窗口来.

哪种方法最适合特定情况?请考虑:

  • 适应不同的系统规格;
  • 易于开发/维护;
  • 易于移植;
  • 最后的表现.

小智 5

我倾向于可变帧率模型,但在内部某些系统是在固定时间步长上打勾的。使用时间累加器很容易做到这一点。物理学是一个最好在固定时间步长上运行的系统,如有必要,每帧会打勾多次,以避免失去稳定性并保持模拟流畅。

一些代码来演示累加器的使用:

const float STEP = 60.f / 1000.f;
float accumulator = 0.f;

void Update(float delta)
{
    accumulator += delta;

    while(accumulator > STEP)
    {
        Simulate(STEP);
        accumulator -= STEP;
    }
}
Run Code Online (Sandbox Code Playgroud)

这无论如何都不是完美的,但提供了基本思想 - 有很多方法可以改进这个模型。显然,当输入帧率非常慢时,有一些问题需要解决。然而,最大的优势是无论增量多快或多慢,模拟都在“玩家时间”中以平滑的速度移动——这是用户会察觉到任何问题的地方。

一般来说,我不会涉足图形和音频方面,但我认为它们不会像物理、输入和网络代码那样受到影响。


Jac*_*gby 3

似乎大多数 3D 开发人员更喜欢可变 FPS:Quake、Doom 和 Unreal 引擎都会根据系统性能进行缩放。

  • 至少你必须补偿太快的帧速率(不像 80 年代的游戏在 90 年代运行,太快了)
  • 无论如何,你的主循环应该通过时间步进行参数化,只要它不是太长,像 RK4 这样的像样的积分器应该能够顺利地处理物理。某些类型的动画(关键帧精灵)可能很难参数化。网络代码也需要智能,例如避免拥有更快机器的玩家发射太多子弹,但无论如何都需要进行这种限制以补偿延迟(动画参数化也将有助于隐藏网络延迟)
  • 每个平台的计时代码都需要修改,但这是一个小的本地化更改(尽管有些系统很难实现极其准确的计时,Windows、Mac、Linux 似乎还可以)
  • 可变帧速率可实现最佳性能。固定帧速率可以实现一致的性能,但永远不会在所有系统上达到最大值(这似乎是任何严肃游戏的阻碍)

如果您正在编写一款性能很重要的网络 3D 游戏,我不得不说,咬紧牙关并实现可变帧速率。

如果这是一款 2D 益智游戏,您可能可以使用固定的帧速率,也许可以针对超慢的计算机和明年的模型进行稍微参数化。