首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FPS和UPS有什么区别,我应该在游戏循环中跟踪UPS吗?

FPS和UPS有什么区别,我应该在游戏循环中跟踪UPS吗?
EN

Stack Overflow用户
提问于 2020-10-27 02:13:09
回答 1查看 1.2K关注 0票数 0

当我发现UPS这个术语时,我正在寻找改进我的游戏循环的方法,以及如何为玩家实现更多的性能选项。我知道它意味着每秒钟更新,但它如何影响性能?我该担心吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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 );这使得它比其他选项好得多(非常平滑,性能问题导致模拟速度变化的可能性很小,等等)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64547432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档