UPS和FPS-我应限制什么,为什么?


11

我目前正在使用C ++和SDL2编写游戏,我想知道一件事-限制每秒的帧数(FPS)和/或每秒的更新数(UPS)是否有意义?

我的想法是,如果您限制UPS,则基本上可以控制游戏的速度-如果玩家每次更新移动1px,并且您始终每秒更新30次,则他将以30px / s的速度移动,而您由于每秒的计算量减少,这也可能减轻CPU的负担。如果限制FPS,则每秒的调用次数会减少,因此可以减轻GPU负担。我希望我能正确理解所有这些内容,如果不能,请随时纠正我。

我的问题是-我应该在游戏中限制什么?FPS?UPS?都?都不行 有另一种更好的方法吗?在大多数游戏中这是如何完成的,为什么?

答案非常感谢!


2
并不是一个真正的答案,但是您可能会发现这很有用:gafferongames.com/game-physics/fix-your-timestep
Cypher

Answers:


10

是的,确实有道理。

正如您所说,它将减轻系统的负载,这对散热和其他应用程序很有用。

但是...您的游戏逻辑不应依赖于每秒的更新。因此,我建议您来看看deltatime,它可以使您的游戏不受每秒更新的影响。

我建议您看一下这个问题。它很好地解释了如何计算和使用它。如何获取和使用时间增量

希望能有所帮助!


所以我应该限制两者还是只限制其中之一?
DocCoock 2015年

两者都有,但是在设置中添加一个选项以进行调整。
KaareZ

5
提醒您:如果您使用物理引擎,请不要依赖增量时间/变量更新框架,因为很少会支持它们。他们需要固定框架方法。而且,如果您的框架波动很大,这可能意味着您的软件存在问题,应该怀疑为什么会发生这种情况。有了这些,您可能会重新考虑使用DT方法。
Vaillancourt

1
需要注意的是使用基于增量时间更新可能会导致物理不稳定和那些虫子非常难再现。在某些游戏中,有些技巧仅在特定帧频下才可能。这就是为什么物理通常以固定帧速率运行的原因。您始终可以以较低的更新速率进行插值,但是如果您的模拟不稳定,则无济于事。
Dietrich Epp 2015年

1
老实说,我认为deltatime不是一个好主意。我已经使用了多年,它带有两个主要问题。许多不同的多人游戏文章都建议使用固定的时间步长,如果deltatime太高,则除非考虑到这一点,否则您可以穿越墙壁或类似的错误进行传送。
Programmdude

6

最好的答案是:这取决于

您不必限制任何一个

更新:如果您的更新没有上限,则游戏逻辑应取决于增量时间量,以避免根据运行计算机的速度更快或更慢地运行游戏。这是许多游戏使用的非常普遍的方法,但它并不是唯一的方法。

渲染:如果渲染没有上限,则帧缓冲区可能以不完整或错误的状态呈现,从而导致撕裂的伪影。这就是为什么许多游戏都采用垂直同步(v-sync)的原因

您可能会限制两者

更新:某些游戏在其部分或全部游戏系统中使用固定的时间步长。正如您所描述的,此方法有效。每秒更新的数量限制在上限,以确保在一流的计算机上运行不会太快。这消除了对增量定时的需要。在固定的时间步长下,某些应用程序更好,而在增量定时下,某些应用程序则更好。选择哪种方法将完全取决于您要实现的目标。在线书籍GameProgrammingPatterns有一章专门介绍了涉及这两种架构的游戏循环

渲染:应该将每秒帧数设置为上限,以避免上述撕裂问题,但是,您的应用程序不应尝试通过某些CPU锁定来手动执行此操作。而是启用v-sync,并使底层硬件与监视器的刷新率同步。这样,您的游戏将与未来的显示器向前兼容,后者可能会以比目前常见的60Hz更高的频率运行。还值得注意的是,许多游戏玩家,尤其是那些进行基准测试的玩家,仍然更喜欢在不使用v-sync的情况下运行,以实现尽可能高的帧频。因此允许在运行时启用或禁用该功能是明智的。

你不应该限制的

如果您的游戏使用基于轮询的方法来输入用户信息,例如:getInput()在更新步骤中调用a 来更新控制器状态,则更好(如果不受限制)。或者如果受限制,则设置为很高的上限。您查询用户输入并对其进行操作的频率越高,游戏“响应”的响应速度和流畅度就越高。我们今天听到的所谓的60Hz游戏并没有以这种速度更新AI和所有世界状态,有些甚至还没有达到那么快的速度,但是它们每秒至少查询控制器输入60次并相应地更新玩家头像。当然,这仅与快节奏的动作游戏有关。


但是,启用VSync后,我的更新也会自动受到限制。因此,我显然必须在撕裂问题和更新轮询问题之间做出选择,对吗?
DocCoock 2015年

@DocCoock,如果您的渲染器和游戏逻辑在同一线程上运行,则可以,启用垂直同步还可以修复更新频率。这是某些游戏将渲染和游戏逻辑隔离到不同线程的原因之一。
glampert

1

您可能要看两篇文章:

修正您的时间表

插值物理渲染

我发现有关帖子的讨论确实非常宝贵,但是我认为,当游戏中进行大量物理模拟时,这才是最有意义的。总而言之,该想法是模拟应具有固定的时间步长(否则,物理量可能会在增量太大的某个点处爆炸),而应该给渲染自由以最大可能的速率运行。为了同步(模拟和渲染),将渲染状态插入一个因子,该因子取决于模拟与后续更新之间的距离(请记住模拟是固定的)。

希望能帮助到你。

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.