半固定或完全固定的时间步?


15

我正在制作iphone shmup,并试图确定要使用哪种类型的游戏循环。我想使用半固定时间步或完全固定时间步。

使用半固定时间步长,我将进行零次或多次update(FIXED_INTERVAL)调用,然后进行一次update(dt)调用,其中每个游戏循环中dt <= FIXED_INTERVAL。据我所知,这种方法的缺点是我的物理update(dt)逻辑将更加难以编程,因为我基本上必须为每次更新都假设一个变量dt。然后我还听说由于浮点值每次都不相同,因此每次游戏的运行都会稍有不同。

然后用固定的时间步长,我进行零次或多次update(FIXED_INTERVAL)调用,然后进行一次插值(dt / FIXED_INTERVAL)调用,其中每个游戏循环中dt <FIXED_INTERVAL。

因此,看来我真正要做的一个重大决定是:我是否想应对使用变量dt实现update(dt)的挑战,还是我想应对实现插值的挑战?

现在,根据我的阅读,大多数人都说要使用完全固定并进行插值。但是,当我考虑实现插值时,似乎比带有变量dt的update(dt)要复杂得多。这是因为如果使用插值,则必须记住先前的状态和当前的状态。因此,如果我想使用插值法,我必须提出一个额外的间接层,以抽象出整个游戏状态。在半固定的时间步中,我不必使用插值法,而我也不必提出游戏状态抽象,因为总只有一个游戏状态,而这仅仅是代表我的敌人和敌人的“全局数组”子弹等

因此,更实际的选择是:知道变量dt会使我的物理更新变得复杂,因此我是否可以半固定地实现它。还是我使用完全固定的并尝试提出游戏状态抽象,以便可以跟踪先前状态和当前状态以执行插值?



1
我已多次阅读该讨论及其中的链接。实际上,这就是我来这篇文章的方式。我的问题主要与如何实现游戏状态以实现插值有关-在本次讨论中完全没有涉及。
瑞安

Answers:


12

完全固定

当您每帧丢一次可变步时,您就会失去固定时间步的大部分好处。

诺埃尔·洛皮斯(Noel Lopis)在他的《凯西的陷阱》(Casey's Contraptions)游戏中实现了固定的时间步长方面有很多著作。作为奖励,他是iphone开发人员,尽管他的技术不是iphone特有的。

文章中的一些要点

  • 使用时间累加器。
  • 为60Hz帧频使用120Hz物理速率。
  • 模拟未来的一个固定步骤,并使用剩余的时间累积来在当前物理状态和未来物理状态之间绘制代码。
  • 各种陷阱

2

你所说的“半固定”和“可完全固定的”时间步是,在我的脑海里,固定时间步长-在DT要传递到您的update通话帧之间不会改变。

因此,您的问题实际上是“我是否要出于渲染目的实施插值?” 答案是:可能不是

只有在固定update时间步长与目标render时间步长明显不同时,才需要插值。对于具有激烈update相位,仅以update10Hz进行调用但以全帧速率渲染的游戏,这种情况并不少见。

由于您正在编写iPhone shmup,因此您update和您的render需求都不会特别占用CPU。您可以轻松地将帧速率锁定为30Hz或60Hz,而不必担心实现问题,并且仍然拥有一款外观流畅的游戏。


我不明白 您是在说我可以锁定我在游戏循环中计算出的大dt,这是我的物理学所消耗的吗?我怎么做?我可以使用CADisplayLink吗?我的意思是,假设您正在使用多少CPU?您是否应该真正假设锁定游戏循环dt?
瑞安

我的意思实际上可以归结为这一点:做最简单的事情就可以了。
布莱尔·霍洛威

1
详细说明:将变量dt用于updaterender是最简单的方法,但是通常在使用物理引擎来避免其引起的不稳定性时避免使用。因此,update使用固定调用dt并以相同的速率渲染(如果update长时间运行则丢弃帧)通常是最简单的方法。编写代码以在update调用之间插值对象会增加代码的复杂性;您要添加的复杂性以解决特别的问题。
布莱尔·霍洛威
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.