【问题标题】:How to unlimit framerate?如何无限帧率?
【发布时间】:2016-10-04 18:52:06
【问题描述】:

我正在尝试完全不限制 SFML 帧速率,以便显示尽可能多的帧。这样做的原因是我想循环通过一段代码来计算物理模拟中对象的位置,并在大约 100 次迭代后更新屏幕。

我已经完成了:

window.SetFramerateLimit(0);
window.UseVerticalSync(false);

SFML 文档说这应该将帧速率设置为“无限”,但我仍然认为它停留在 60 左右。

有谁知道我怎样才能从中获得更高的性能?

同样,一旦不受限制,我需要能够在 SFML 中从 SDL 执行等效操作:

SDL.延迟(1000);

有没有办法做到这一点? SDL 延迟很好,因为它可以为其他进程释放 CPU 时间。

【问题讨论】:

  • 这可能是您的显示器而不是 SFML,出于性能原因,某些较旧的显示器不允许 FPS 超过某个点。你的显示器几岁了?
  • 这是一台 Macbook Pro 显示器,来自 13"3 Macbook 2011 型号,运行 xubuntu 12.10。

标签: c++ time sfml frame-rate


【解决方案1】:

虽然您可以使用 SFML 停用/激活 VSync,但不能保证它会真正被激活,因为驱动程序本身具有最终决定权,并且它们通常提供强制打开或关闭 VSync 的选项。所以我想说你应该看看你的图形驱动程序的设置。

然后我想知道你真正想用“无限”帧速率实现什么,因为它通常只会最大化你的 CPU 的一个核心,尽管应用程序实际上没有做任何事情。如果你只是想要更多的 CPU 时间来计算东西,那么这两种方法(VSync 和setFramerateLimit())都不应该阻止任何东西。

我强烈建议您使用 SFML 2,因为 SFML 1.6 已经超过 2.5 年没有得到维护,有很多丑陋的错误并且缺少一些非常有用的功能(例如 RenderTexture、VertexArray、...)。

【讨论】:

  • 好的,谢谢,我下载了 SFML 2.0,但不知道如何在 xubuntu 上设置它...应该有一个 makefile 什么的,但是没有... :( 无限帧率的原因是我将能够保持任意帧率而不会失去等待下一帧的 cpu 时间。延迟是为了防止无法移动窗口和其他事情的问题。
  • official tutorials 的存在是有原因的... SFML 使用构建系统 CMake,它反过来会生成一个 makefile 或一个项目文件。对于帧速率,您应该将渲染和物理解耦,这样您就可以以固定速率运行物理,并且仅在图像也将显示时才显示。
  • 目前没有物理运行。有一个无限循环调用要显示的窗口,因此我预计它的运行速度远远超过 60FPS,并希望看到一个 CPU 内核的执行率接近 100%。这没有发生,这就是问题所在。
  • 我知道问题出在哪里,我已经在回复中为您提供了解决方案,并将您链接到官方教程,这是开始使用 SFML 时必读的...
  • 我没有看到解决方案,你告诉我要解除它们的耦合,我告诉你这不是问题。
【解决方案2】:

我不确定帧率问题。根据文档,这将起作用。我会尝试的一件事是一次删除(或注释掉)一个语句,看看它是否有帮助,或者两者都有:垂直因为应该默认关闭,我觉得帧率默认为无穷大,但我可能是错误的。此外,帧速率可能是无限的,但计算只需要足够的时间就可以做到~60 fps。最后,也许它是监视器的限制,如上所述。

关于延迟,我相信您正在考虑睡眠功能 - 使当前线程暂停一段时间。我知道在 SFML 2 中,这是 sf::sleep(sf::Time),其中时间可以通过例如:sf::seconds(float t)、sf::milliseconds 等推导出来。它们返回一个 Time目的。在 SFML 1.6 中,它是 sf::Sleep(float seconds)。

另外,我不知道这是否能解决问题,但我认为 SFML 在 Apple 方面存在一些问题,所以也许吧,假设您使用的是 1.6 或更低版本,版本 2 解决了问题。第 2 版现已发布......好吧,您不必自己编译它。我认为它解决了其他问题,也许这是以前的问题。

【讨论】:

  • 好的,谢谢,我会很容易地获得新版本或其他东西,看看它是否有所作为。也没有运行代码来减慢它的速度,它应该在一个while循环中永远循环。将程序减慢到 60FPS 的语句是 window.Display();这是更新屏幕的SFML方法。
  • 在那种情况下,它可能是别的东西。我只是想知道你的物理模拟是否会减慢它的速度。在这种情况下,我猜是监视器/vsync。
【解决方案3】:

通过不设置帧速率限制或将其设置为零(这是默认设置),sfml 窗口也应该尽可能快地显示帧。不幸的是,问题似乎出在驱动程序上,它们强制启用 vsync。因为这是 Macbook Pro,带有 HD3000 显卡和 Intel 驱动程序,我不知道如何强制关闭垂直同步。

还有其他方法可以解决这个问题,例如使用 if 语句来决定是否在每个循环中更新屏幕。这就是我所做的,虽然它不是一个理想的解决方案。

关于 SDL 的延迟功能,SFML 提供了sf::Sleep() 功能。该函数使用sf::Time 对象的参数调用,用户可以设置延迟的微秒数、毫秒数和秒数。

但是请注意,此函数不会“休眠”或“延迟”这段确切的时间 - 操作系统会在“稍后的某个时间,至少在请求的休眠时间之后”返回。我不完全理解它是如何工作的,或者你可以期望用sf::Sleep()SDL_Delay() 实现什么“时间分辨率”。

【讨论】:

  • @andreasm 不一样/合适
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 2018-10-25
  • 2020-04-07
相关资源
最近更新 更多