Arc*_*gon 7 graphics 2d game-physics
"超级肉食男孩"是一款最近出现在PC上的难度平台游戏,需要出色的控制和像素完美的跳跃.游戏中的物理代码取决于帧率,锁定为60fps; 这意味着如果你的计算机无法全速运行游戏,那么物理将变得疯狂,导致(除其他外)你的角色跑得更慢并且从地面掉落.此外,如果vsync关闭,游戏运行速度非常快.
那些有2D游戏编程经验的人能帮助解释为什么游戏是用这种方式编码的吗?以恒定速率运行的物理循环不是更好的解决方案吗?(实际上,我认为物理循环用于游戏的某些部分,因为无论帧速率如何,某些实体都会继续正常移动.另一方面,你的角色运行速度恰好[fps/60].)
令我困惑的是这个实现是游戏引擎和图形渲染之间的抽象丢失,这取决于系统特定的东西,如显示器,图形卡和CPU.无论出于何种原因,如果您的计算机无法处理vsync,或者无法以60fps的速度运行游戏,那么它将会非常突破.为什么渲染步骤会以任何方式影响物理计算?(现在大多数游戏要么放慢游戏速度,要么跳过帧.)另一方面,我知道NES和SNES上的老式平台游戏依赖于固定帧速率来控制和物理.为什么会这样,并且可以在没有帧率依赖性的情况下创建一个变形器?如果将图形渲染与引擎的其余部分分开,是否一定会损失精度?
谢谢你,如果这个问题令人困惑,那就很抱歉.
没有理由说物理学应该依赖于帧率,这显然是一个糟糕的设计.
我曾经试图理解为什么人们会这样做.我对公司另一个团队编写的游戏进行了代码审查,我从一开始就没有看到它,但他们在代码中使用了大量硬编码值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并且游戏将顺利运行.
总而言之,很抱歉写了这么长的消息,但我想强调一下,任何人都会做这样的事情的唯一原因是糟糕的设计.
他们可能需要足够快地完成游戏,并决定用当前的实现来覆盖足够的用户群。
现在,如果你在开发过程中考虑一下的话,改造独立性并不是那么困难,但我认为它们可能会陷入一些陡峭的困境。
我认为这是不必要的,而且我以前见过它(一些早期的 3d-hw 游戏使用了同样的东西,如果你看天空,游戏会变快,如果你看地面,游戏会变慢)。
实在是太糟糕了。向开发人员报告这个问题,并希望他们能够修补它(如果可以的话)。