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

时间:2020-03-05 18:50:26  来源:igfitidea点击:

在开发游戏一段时间后,我接触到了可变帧速率(我们可以计算出自上次滴答以来经过了多少时间,并相应地更新了演员的动作)和固定帧速率(可以计算出多少时间)已经过去,并选择在固定的时间间隔内打勾,或者选择睡眠直到下一个窗口出现。

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

  • 迎合不同的系统规格;
  • 易于开发/维护;
  • 易于移植;
  • 最终表现。

解决方案

回答

我的经验仅限于一些简单的游戏(使用SDL和C ++开发),但是我发现仅实现静态帧速率是很容易的。我们正在使用2D或者3D游戏吗?我认为,更复杂的3d环境将从可变的帧速率中受益更多,并且难度会更大。

回答

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

  • 至少我们必须补偿太快的帧速率(不同于80年代的游戏在90年代运行,太快了)
  • 无论如何,主循环都应该通过时间步进行参数化,并且只要时间不长,像RK4这样的体面积分器就应该可以平稳地处理物理过程。某些类型的动画(关键帧精灵)可能很难进行参数化。网络代码也必须很聪明,例如,避免使用速度更快的机器的玩家射击过多的子弹,但是无论如何,都需要进行这种节流以进行延迟补偿(动画参数化也将有助于隐藏网络滞后)
  • 每种平台的计时代码都需要修改,但这只是一个小的本地化更改(尽管某些系统很难实现非常精确的计时,Windows,Mac,Linux似乎还可以)
  • 可变帧速率可实现最佳性能。固定帧速率可提供一致的性能,但在所有系统上都无法达到最大值(这似乎是任何严肃游戏的停滞点)

如果我们要编写一款网络3D游戏,而我不得不说这对性能至关重要,那么请硬着头皮并采用可变的帧频。

如果它是2D益智游戏,则我们可能可以以固定的帧速率摆脱困境,对于超慢速的计算机和明年的型号,可能会对其进行一些参数设置。

回答

作为用户,我希望看到的一个选项是,当帧速率在certical包络之外变化时,动态更改细节级别(广义上,而不仅仅是技术上)。如果以5FPS渲染,则关闭凹凸贴图。如果我们以90FPS的速度渲染,请增加一些响亮的声音,并为用户提供一些更漂亮的图像,以浪费其CPU和GPU。

如果操作正确,则用户应该获得最佳的游戏体验,而不必进入设置屏幕并自行进行调整,而作为关卡设计师,我们不必担心在不同场景中保持多边形数相同。

当然,我说的是游戏用户,而不是那么认真的人-我从来没有尝试过编写平凡的游戏。

回答

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

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

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

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

    while(accumulator > STEP)
    {
        Simulate(STEP);
        accumulator -= STEP;
    }
}

这绝对不是完美的方法,但是它提出了基本思想,有很多方法可以对此模型进行改进。显然,当输入帧速率过慢时,有一些问题需要解决。但是,最大的优势是,无论增量多快或者多慢,模拟都在"玩家时间"中以平稳的速度移动,这是用户将察觉到任何问题的地方。

通常,我不涉足图形和音频方面,但我认为它们不受物理,输入和网络代码的影响最大。

回答

我遇到的可变长度帧时间的主要问题是浮点精度,可变帧时间会让我们吃惊。

例如,如果将帧时间*速度加到一个位置上,并且帧时间变得非常小,并且位置较大,则对象可能会减慢速度或者停止移动,因为由于精度而丢失了所有增量。我们可以使用单独的错误累加器对此进行补偿,但这很痛苦。

固定(或者至少限制帧长的下限)帧时间使我们可以控制需要考虑多少FP错误。