如何限制帧率?

时间:2012-12-25 17:16:12

标签: c++ time sfml frame-rate

我试图完全取消限制SFML帧率,以便尽可能多地显示帧。原因是我想循环一段代码来计算物理模拟中对象的位置,并在大概100次迭代后更新屏幕。

我做了:

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

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

有谁知道如何从中获得更多性能?

一旦无限制,我需要能够在SDL中从SFL中完成相应的操作:

SDL.Delay(1000);

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

3 个答案:

答案 0 :(得分:3)

虽然您可以使用SFML取消/激活VSync,但不能保证它实际上会被激活,因为驱动程序本身具有最后一个字,并且它们通常提供强制打开或关闭VSync的选项。所以我想你应该看看你的图形驱动程序的设置。

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

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

答案 1 :(得分:1)

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

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

另外,我不知道这是否修复了它,但我认为SFML在Apple方面遇到了一些问题,所以mabye,假设您使用的是1.6或更少,版本2修复了问题。版本2现在已经......好吧,你不必自己编译它。我认为它修复了其他问题,也许这是以前的问题。

答案 2 :(得分:-2)

通过不设置帧速率限制或将其设置为零(默认值),sfml窗口应该尽可能快地显示帧。不幸的是,问题似乎与驱动程序有关,这些驱动程序正在强制启用vsync。因为这是Macbook Pro,有HD3000显卡和英特尔驱动程序,我不知道如何强行关闭vsync。

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

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

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