FPS 和 UPS 有啥区别?我应该在游戏循环中跟踪 UPS 吗?
Posted
技术标签:
【中文标题】FPS 和 UPS 有啥区别?我应该在游戏循环中跟踪 UPS 吗?【英文标题】:What is the difference between FPS and UPS and should I keep track of UPS on my game loop?FPS 和 UPS 有什么区别?我应该在游戏循环中跟踪 UPS 吗? 【发布时间】:2020-10-27 02:13:09 【问题描述】:当我发现 UPS 一词时,我正在寻找改进我的游戏循环以及如何为玩家提供更多性能选项的方法。我知道这意味着每秒更新,但它如何影响性能?我应该担心吗?
【问题讨论】:
【参考方案1】:假设您有一个非常简单的游戏,它只有一个线程和一个基本循环,例如“while(running) get_input(); update_world_state(); update_video();
”。在这种情况下,您最终会得到“UPS = FPS”(没有理由将 UPS 与 FPS 分开跟踪);如果 GPU 难以跟上整个游戏的速度(例如,如果您每秒获得 15 帧,那么与图形无关的事情可能需要比应有的时间长 4 倍,即使您有 8 个 CPU 也是如此在等待 GPU 完成时什么也不做)。
对于另一种选择,如果您有 2 个线程,其中一个线程执行“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 公里的速度移动,以每小时 200 公里的速度移动,因为update_world_state()
被频繁调用)。取决于事物和东西,你可能会得到 60 个 UPS(不管 FPS 是多少);但是如果 CPU 跟不上游戏的速度,游戏可以/仍然会变慢,你可能会得到 20 个 UPS(不管 FPS 是多少)。当然,如果世界状态没有改变,那么更新视频是没有意义的;所以您希望图形循环更像“while(running) wait_for_world_state_update(); update_video();
”,其中wait_for_world_state_update()
确保 FPS wait_for_world_state_update() 立即返回,没有任何延迟)。
除此之外的下一步是“tickless”。在这种情况下,您可能有一个高优先级线程监控用户输入并为输入事件分配时间戳(例如“在时间 = 12356,用户开火了他们的主要武器”)并将它们存储在一个列表中。然后你可能会有第二个(较低优先级,以避免弄乱用户输入时间戳的准确性)线程,其主循环类似于“while(running) next_frame_time = estimate_when__next_frame_will_actually_be_visible(); update_world_state_until(next_frame_time); update_video();
”,其中update_world_state_until()
使用一大堆数学来预测游戏状态将在特定时间点(并在考虑其时间戳的同时使用存储的用户输入事件列表)。在这种情况下,UPS 没有任何意义(您只关心 FPS)。这也更加复杂(由于在任何时间点计算世界状态都涉及数学);但最终结果就像拥有“无限 UPS”,而无需每帧多次更新世界状态的开销;它允许您隐藏任何图形延迟(例如,看到的东西比他们应该看到的晚 16.66 毫秒);这使得它明显优于其他选项(更平滑,性能问题导致模拟速度变化的可能性显着降低等)。
【讨论】:
以上是关于FPS 和 UPS 有啥区别?我应该在游戏循环中跟踪 UPS 吗?的主要内容,如果未能解决你的问题,请参考以下文章