2D平台游戏:为什么要使物理引擎与帧率相关?

9
"Super Meat Boy"是一款难度较高的平台游戏,最近在PC上推出,需要极佳的控制和像素完美的跳跃。游戏中的物理代码依赖于帧率,帧率被锁定为60fps;这意味着如果你的电脑无法以全速运行游戏,物理效果会变得疯狂,导致(除其他问题外)你的角色奔跑得更慢并穿过地面。此外,如果vsync关闭,游戏将运行得非常快。
那些有2D游戏编程经验的人能否解释一下为什么要以这种方式编写游戏?一个以恒定速率运行的物理循环不是更好的解决方案吗? (实际上,我认为游戏的某些部分使用了物理循环,因为其中一些实体继续以正常速度移动,而不受帧率的影响。另一方面,你的角色确切地以[fps / 60]的速度奔跑。)
这种实现让我感到困扰的是游戏引擎与图形渲染之间的抽象丧失了,它依赖于系统特定的东西,如显示器、显卡和CPU。如果由于任何原因,你的电脑无法处理vsync,或者无法以恰好60fps运行游戏,它将会出现明显的问题。为什么渲染步骤要以任何方式影响物理计算呢?(现在大多数游戏要么减慢游戏速度,要么跳帧。)另一方面,我了解到NES和SNES上的老派平台游戏在很大程度上依赖于固定的帧率来控制和物理效果。为什么这样做,有没有可能创建一个不依赖于帧率的平台游戏?如果将图形渲染与引擎的其余部分分开,是否必然会丧失精度?
谢谢,如果问题有点混乱,请见谅。

3
这个问题最好在http://gamedev.stackexchange.com/上询问。 - Jackson Pope
3个回答

9
没有理由物理学应该依赖帧速率,这显然是一种糟糕的设计。
我曾经试图理解为什么人们会这样做。我对公司另一个团队编写的游戏进行了代码审查,一开始我并没有看出来,但他们在代码中使用了很多硬编码值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,游戏就会平稳运行。
总之,很抱歉写了这么长的消息,但我想强调的是,任何人这样做的唯一原因是糟糕的设计。

3
很棒的趣闻回答。现在,我也想在thedailywtf上看到它 :-) - user166390

2
这里有一个很好的解释,说明为什么您的时间步长应该保持不变:http://gafferongames.com/game-physics/fix-your-timestep/。此外,根据物理引擎的不同,当时间步长改变时,系统可能会变得不稳定。这是因为在帧之间缓存的一些数据是与时间步长相关的。例如,迭代求解器(约束如何解决)的起始猜测可能与答案相差甚远。我知道Havok(许多商业游戏使用的物理引擎)是如此,但我不确定SMB使用哪个引擎。几个月前,《游戏开发者杂志》上还有一篇文章,说明了如何通过不同的帧速率以相同的初始速度跳跃,达到不同的最大高度。其中有一个关于游戏(托尼霍克?)的支持轶事,在NTSC版本的游戏上可以完成某个跳跃,但在PAL版本上却不能(因为帧速率不同)。抱歉我现在找不到这个问题,但如果您想要,我可以稍后试着找到它。

0

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

现在,如果你在开发过程中考虑到独立性,那么它并不是真的很难进行改装,但我想他们可能会遇到一些陡峭的问题。

我认为这是不必要的,而且我以前也见过这种情况(一些早期的3D硬件游戏使用了相同的方法,当你看向天空时,游戏会变得更快,而当你看向地面时,游戏会变得更慢)。

这只是很糟糕。向开发人员反馈此问题,并希望他们能够修复它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接