2D平台:为什么物理依赖于帧速率?

时间:2010-12-27 19:55:18

标签: graphics 2d game-physics

“超级肉食男孩”是一款最近出现在PC上的难度平台游戏,需要出色的控制和像素完美的跳跃。游戏中的物理代码取决于帧率,锁定为60fps;这意味着如果你的计算机无法全速运行游戏,那么物理将变得疯狂,导致(除其他外)你的角色跑得更慢并且从地面掉落。此外,如果vsync关闭,游戏运行速度非常快。

那些有2D游戏编程经验的人是否有助于解释为什么游戏以这种方式编码?以恒定速率运行的物理循环不是更好的解决方案吗? (实际上,我认为物理循环用于游戏的某些部分,因为无论帧速率如何,一些实体都会继续正常移动。另一方面,你的角色运行速度恰好[fps / 60]。)< / p>

让我对这个实现感到困扰的是游戏引擎和图形渲染之间的抽象丢失,这取决于系统特定的东西,如显示器,显卡和CPU。无论出于何种原因,如果您的计算机无法处理vsync,或者无法以60fps的速度运行游戏,那么它将会非常突破。为什么渲染步骤会以任何方式影响物理计算? (现在大多数游戏要么放慢游戏速度,要么跳过帧。)另一方面,我知道NES和SNES上的老式平台游戏依赖于固定帧速率来控制和物理。为什么会这样,并且可以在没有帧率依赖性的情况下创建一个变形器?如果将图形渲染与引擎的其余部分分开,是否一定会损失精度?

谢谢你,如果这个问题令人困惑,我很抱歉。

3 个答案:

答案 0 :(得分:7)

没有理由说物理学应该依赖于帧率,这显然是一个糟糕的设计。

我曾经试图理解为什么人们会这样做。我对公司另一个团队编写的游戏进行了代码审查,我从一开始就没有看到它,但他们在代码中使用了大量硬编码值17。当我在显示FPS的调试模式下运行游戏时,我看到它,FPS正好是17!我再次查看代码,现在很清楚:程序员认为游戏总是具有17 FPS的恒定帧速率。如果FPS大于17,他们会睡觉以使FPS正好是17.当然,如果FPS小于17,他们什么也没做,游戏就是疯了(就像在2 FPS下玩并驾驶一辆车一样)游戏中,游戏系统提醒我:“太快了!太快了!”。)。

所以我写了一封电子邮件,询问为什么他们硬编码这个值并使用它们的物理引擎,他们回答说这样他们让引擎更简单。我再次回复,好吧,但如果我们在一台无法达到17 FPS的设备上运行游戏,那么你的游戏引擎运行起来非常有趣,但并不像预期的那样。他们说这将解决问题,直到下一次代码审查。

在3或4周后我得到了一个新版本的源代码,所以我真的很想知道他们用FPS常数做了什么,所以我要做的第一件事就是在17之后搜索代码并且只有几个匹配,但其中一个不是我想看的东西:

final static int FPS = 17;

因此,他们从所有代码中删除了所有硬编码的17值,并使用了FPS常量。他们的动机:现在如果我需要将游戏放在只能达到10 FPS的设备上,我需要做的就是将FPS设置为10并且游戏将顺利运行。

总而言之,很抱歉写了这么长的消息,但我想强调一下,任何人都会做这样的事情的唯一原因就是糟糕的设计。

答案 1 :(得分:2)

这里有一个很好的解释为什么你的时间步长应该保持不变:http://gafferongames.com/game-physics/fix-your-timestep/

此外,根据物理引擎,当时间步长发生变化时,系统可能会变得不稳定。这是因为帧之间缓存的某些数据与时间步长有关。例如,迭代求解器的起始猜测(解决约束的方式)可能与答案相差甚远。我知道Havok(许多商业游戏使用的物理引擎)都是如此,但我不确定SMB使用哪种引擎。

几个月前Game Developer Magazine也发表了一篇文章,说明了在不同的帧速率下,不同的最大高度如何实现具有相同初始速度但不同时间步长的跳跃。有一个来自游戏的支持轶事(Tony Hawk?),当在NTSC版本的游戏上运行而不是PAL版本时可以进行一定的跳转(因为帧速率不同)。对不起,我现在找不到问题,但如果你愿意,我可以试着稍后再挖掘它。

答案 2 :(得分:0)

他们可能需要足够快地完成游戏,并决定用当前的实现来覆盖足够的用户群。

现在,如果你在开发过程中考虑它,那么

我认为这是不必要的,我以前见过它(一些早期的3D-hw游戏使用相同的东西,如果你看着天空,游戏会变得更快,如果你看着地面,游戏会变慢)。 / p>

它很糟糕。关于它的开发人员的错误,并希望他们修补它,如果可以的话。