当我发现UPS这个术语时,我正在寻找改进我的游戏循环的方法,以及如何为玩家实现更多的性能选项。我知道它意味着每秒钟更新,但它如何影响性能?我该担心吗?
发布于 2020-10-27 03:28:43
让我们假设您有一个非常简单的游戏,只有一个线程和一个基本循环,比如"while(running) { get_input(); update_world_state(); update_video(); }
“。在这种情况下,您的结果是"UPS = FPS“(没有理由单独跟踪UPS和FPS);如果GPU很难保持整个游戏的速度慢下来(例如,如果您每秒获得15帧,那么与图形无关的事情可能要比它们应该花费的时间长4倍,即使您在等待GPU完成时有8个GPU什么都不做)。
作为一种选择,如果有两个线程,其中一个线程执行"while(running) { get_input(); update_world_state(); }
“,另一个线程执行"while(running) { update_video(); }
”怎么办?在这种情况下,没有理由期望UPS与FPS有任何关系。这里的问题是,大多数游戏都不够聪明,无法处理可变的计时问题,因此您最终会得到更像"while(running) { get_input(); update_world_state(); wait_until_next_update_starts(); }
“这样的东西,以确保游戏不能运行得太快(例如,人们认为以每小时20公里的速度行驶的汽车,因为update_world_state()
被频繁调用而以每小时200公里的速度行驶)。取决于事物和东西,您可能会得到60 UPS (不管什么是FPS );但是如果CPU不能跟上游戏的速度,您可能会得到20个UPS (不管FPS是什么)。当然,如果世界状态没有改变,更新视频是没有意义的;因此,您希望图形循环更像"while(running) { wait_for_world_state_update(); update_video(); }
",其中wait_for_world_state_update()
确保FPS <= UPS (以及wait_for_world_state_update()
在UPS保持时立即返回)。
接下来的一步是“不痒”。在这种情况下,您可能有一个高优先级线程监视用户输入,并将时间戳分配给输入事件(例如,“时间= 12356,用户发射了他们的主要武器”)并将它们存储在列表中。然后,您可能有第二个线程(优先级较低,以避免混淆用户输入时间戳的准确性),其中update_world_state_until()
使用一堆数学来预测特定时间点的游戏状态(并使用存储的用户输入事件列表,同时考虑到它们的时间戳)。在这种情况下,UPS没有任何意义(您只关心FPS)。这也要复杂得多(由于在任何时间点计算世界状态所涉及的数学问题);但最终结果就像拥有“无限UPS”,而不需要每帧更新一次以上的世界状态的开销;它允许您隐藏任何图形延迟(例如,比它们应该看到的东西晚16.66 ms );这使得它比其他选项好得多(非常平滑,性能问题导致模拟速度变化的可能性很小,等等)。
https://stackoverflow.com/questions/64547432
复制相似问题