8

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

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

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

5 回答 5

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

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

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

于 2008-09-12T16:57:11.000 回答
3

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

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

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

如果它是一款 2D 益智游戏,您可能可以使用固定的帧速率,可能会为超慢速计算机和未来几年的模型稍微参数化。

于 2008-09-10T00:17:01.577 回答
3

作为用户,我希望更频繁地看到的一个选项是当帧速率在一定范围之外变化时动态改变细节水平(在广义上,不仅仅是技术意义上)。如果您以 5FPS 进行渲染,请关闭凹凸贴图。如果您以 90FPS 进行渲染,请稍微增加一些花里胡哨的功能,并为用户提供一些更漂亮的图像来浪费他们的 CPU 和 GPU。

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

当然,我是作为一个游戏用户说的,而不是一个严肃的人——我从来没有尝试过写一个不平凡的游戏。

于 2008-09-10T00:26:54.093 回答
3

我遇到的可变长度帧时间的主要问题是浮点精度,可变帧时间会让你惊讶于它们如何咬你。

例如,如果您将帧时间 * 速度添加到某个位置,并且帧时间变得非常小,并且位置较大,则您的对象可能会减慢或停止移动,因为您的所有增量都因精度而丢失。您可以使用单独的错误累加器来弥补这一点,但这很痛苦。

固定(或至少帧长度的下限)帧时间允许您控制需要考虑多少 FP 错误。

于 2008-09-16T18:10:05.253 回答
0

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

于 2008-09-10T00:09:38.160 回答