我应该以什么更新速率运行我的固定速率游戏逻辑?
我过去每秒使用 60 次更新,但这很难,因为它不是每秒更新的偶数 (16.666666)。我目前的游戏使用 100,但对于大多数事情来说,这似乎有点过分了。
我应该以什么更新速率运行我的固定速率游戏逻辑?
我过去每秒使用 60 次更新,但这很难,因为它不是每秒更新的偶数 (16.666666)。我目前的游戏使用 100,但对于大多数事情来说,这似乎有点过分了。
以上都不是。为了尽可能流畅的游戏玩法,您的游戏应该是基于时间的,而不是帧锁定的。帧锁定适用于简单的游戏,您可以在其中调整逻辑并锁定帧速率。它不适用于现代 3D 标题,其中帧率在整个板上跳跃并且屏幕可能不是垂直同步的。
你需要做的就是弄清楚一个对象应该走多快(即每秒虚拟单位),计算自上一帧以来的时间量,缩放虚拟单位的数量以匹配已经过去的时间量,然后将这些值添加到对象的位置。瞧!基于时间的运动。
我曾经维护一个 Quake3 mod,这是用户问题的持续来源。
Q3 默认使用 20 个“每秒滴答声”——图形子系统会进行插值,因此您可以在屏幕上获得流畅的运动。我最初认为这太低了,但结果很好,而且真的没有多少游戏比 q3 动作更快
我个人会选择“对约翰·卡马克来说足够好,对我来说足够好”
我喜欢 50 用于固定费率的电脑游戏。我真的分不清 50 和 60 之间的区别(如果你正在制作一个可以/关心你的游戏,你可能应该是 100)。
您会注意到问题是“固定速率游戏逻辑”而不是“绘制循环”。为清楚起见,代码将类似于:
while(1)
{
while(CurrentTime() < lastUpdate + TICK_LENGTH)
{
UpdateGame();
lastUpdate += TICK_LENGTH;
}
Draw();
}
问题是 TICK_LENGTH 应该是什么?
请记住,除非您的代码被测量到循环,否则不是每个游戏循环都会花费相同的毫秒数来完成 - 所以 16.6666 不合理并不是问题,因为无论如何您都需要时间和补偿。此外,它不是每秒 16.6666 次更新,而是您的游戏循环应该瞄准的平均毫秒数。
这些变量通常最好通过猜测和检查策略找到。
以与刷新无关的方式实现您的游戏逻辑(例如,将 ms/update 公开为变量,并在任何计算中使用它),然后尝试刷新直到它起作用,然后将其保留在那里。
作为一个短期的解决方案,如果你想要一个均匀的更新率但不关心每秒更新的均匀性,15ms 接近 60 次更新/秒。如果两者都适用,那么最接近的选项是 20 毫秒或 50 次更新/秒,这可能是您将获得的最接近的值。
在任何一种情况下,我都会简单地将时间视为双倍(或高分辨率的长),并将您的游戏的速率作为变量提供,而不是对它们进行硬编码。
理想的情况是以与显示器相同的刷新率运行。这样,您的视觉效果和游戏更新就不会彼此同步或不同步。每个帧不会持续整数毫秒这一事实对您来说并不重要;为什么这是个问题?
我通常使用 30 或 33。这通常足以让用户感受到流量,并且足够稀有而不会过多地占用 CPU。
通常我不会限制游戏的 FPS,而是更改我的所有逻辑以将最后一帧经过的时间作为输入。
就固定利率而言,除非您出于任何原因需要高利率,否则您应该使用 25/30 之类的方式。这应该是足够的速率,并且将使您的游戏在 CPU 使用上更轻一些。
您的引擎应该同时“滴答”(更新)并以 60fps 的速度绘制垂直同步 (vsync)。这个刷新率足以提供:
如果需要,游戏物理和渲染器都应该能够丢帧,但要优化您的游戏以尽可能接近这个 60hz 标准。此外,像 AI 这样的一些子系统可以接近 10-20fps,并确保您的物理在帧到帧的时间增量上进行插值,如下所示: http: //gafferongames.com/game-physics/fix-your-时间步长/