2

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

我已经做好了:

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

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

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

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

SDL.延迟(1000);

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

4

3 回答 3

3

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

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

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

于 2012-12-27T19:02:56.220 回答
1

我不确定帧率问题。根据文档,这将起作用。我会尝试的一件事是一次删除(或注释掉)一个语句,看看它是否有帮助,或者两者都有:垂直因为应该默认关闭,我觉得帧率默认为无穷大,但我可能是错误的。此外,帧速率可能是无限的,但计算只需要足够的时间就可以做到~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 版现已发布......好吧,您不必自己编译它。我认为它解决了其他问题,也许这是以前的问题。

于 2012-12-25T18:39:21.890 回答
-2

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

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

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

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

于 2012-12-28T12:26:29.407 回答