游戏循环帧独立

Posted

技术标签:

【中文标题】游戏循环帧独立【英文标题】:Game Loop frame independent 【发布时间】:2012-05-24 15:06:25 【问题描述】:

是否可以让游戏循环尽可能快地运行?目前我可以设置我想要的 fps,因此在我的游戏将发送到的所有设备上都有一个恒定的 fps。然而,在速度更快的移动设备上,拥有更流畅的图形会更好。我看了一下框架独立更新。当使用独立于帧的更新时,不需要暂停一段时间(以达到所需的fps),如果更新和渲染在游戏线程中花费很长时间,是否不需要只更新而不渲染?请把我清理干净。

【问题讨论】:

【参考方案1】:

我的经验(我并不孤单)通常是个坏主意:

测试/识别错误要困难得多: 您忘记在某些事情上考虑帧时间,如果您的游戏通常以相当均匀的帧率运行,偶尔会下降/飙升,那么您需要很长时间才能发现这些问题。但是,对于使用比您的测试设备快/慢得多的设备的人来说,它们会非常明显。 您对各种涉及浮点错误/等的难以发现的错误敞开心扉。错误可能仍会出现在固定 FPS 循环中,但它们会在每一帧发生,而不是仅在恰好花费 3124 纳秒的帧上发生。 对于非固定更新间隔,实时物理模拟非常困难。相信我这个!您可以通过使用固定时间步长进行物理更新来解决此问题,但这也有其自身的风险。 您必须计算否则可能是常数的东西。根据具体情况非常小,但可以加起来。 (这取决于您制作的游戏的性质)。 如果您始终以 100% 的速度运行 CPU,它会更快地消耗用户的电池电量。

我的建议是以适当的固定帧速率运行您的逻辑并尽可能频繁地渲染,尽管没有必要频繁地渲染而不是更新逻辑。如果有“空闲”时间,那就睡吧。用户的电池会感谢你,用户不会想知道为什么他们的手机在玩你的游戏时会这么热!

让它感觉流畅的关键是确保逻辑更新的固定帧速率足够高。事实上,超过一定帧率的用户不会注意到差异。足够高的高度取决于您的游戏的确切性质,但 30 fps 对于动作游戏来说相当普遍。用户可以看到移动/改变的东西越快,固定帧率想要的越快 - 例如第一人称射击游戏总是需要比策略游戏更高的帧率。

您可以采取的另一个选择是创建逻辑“快照”并在渲染时在它们之间进行插值。这是用于平滑多人游戏的常用技术,如here 所述。它还使它成为比更新逻辑更频繁地呈现的有效选项!

编辑:希望澄清一些事情。

【讨论】:

感谢您的回复。这让我对我正在处理的事情有了更深入的了解。然而,您建议以固定帧速率更新并尽可能频繁地渲染可能会导致渲染多于更新,这没有任何意义。然而,如果我们可以平滑更快手机上的所有图形,那么以固定帧速率更新就不会很酷了。 :( 更新了我的答案。您是否真的尝试过在高速手机上以不同的帧速率运行,看看是否能看到流畅度的差异? 我试过在同一部手机上提高 fps。更快的 fps 更快,但这是由于更新速度更快。然而,流畅度在 30 fps 时是可以接受的,应该可以在 G1 和 G2 设备上运行。所以我相信我会坚持下去。 :D【参考方案2】:

您绝对不应对帧速率施加任何人为限制。尽可能快地跑。跟踪每帧花费的时间(使用增量),然后您可以使用它来准确计算下一帧相对于时间的状态。

【讨论】:

所以你建议我应该尽快运行游戏?你这样做吗?你发现这有什么问题吗?【参考方案3】:

没错。当您尽可能快地渲染时 - 您实际上是根据与当前时间成比例的值更新每个对象。

因此,当您有一个旋转立方体时 - 它每秒旋转 X 度,而不是每帧 X 度。这将确保在较差的机器上,中间帧被跳过并且立方体的旋转会显得不稳定。但在好的机器上,您会看到平稳的旋转。

【讨论】:

以上是关于游戏循环帧独立的主要内容,如果未能解决你的问题,请参考以下文章

如何为游戏循环制作计时器?

固定时间步长游戏循环中的帧速率上限 - Java

大话游戏循环Game Loop——Python&C++

Unity认识常用的生命周期函数(AwakeStartUpdate...)

游戏的构成

在android游戏中放置主游戏循环的位置