2012-12-25 43 views
2

我想完全不限制SFML幀速率,以便儘可能多的幀顯示。原因是我想循環一段代碼來計算物理模擬中物體的位置,並在大概100次迭代後更新屏幕。如何限制幀率?

我做:

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

的SFML文件說,這應該幀速率設置爲「無限」,但我仍然認爲這是停留在約60十歲上下。

有誰知道我該如何從中獲得更多的表現?

也曾經無限的,我需要能夠做到這相當於在SFML,從SDL:

SDL.Delay(1000);

有沒有辦法做到這一點? SDL延遲很好,因爲它釋放了其他進程的CPU時間。

+0

這可能是您的顯示器而不是SFML,一些較舊的顯示器由於性能原因不允許FPS超過特定點。你的顯示器多大了? –

+0

這是一款Macbook Pro顯示器,來自13「3 Macbook 2011型號,運行xubuntu 12.10。 – user3728501

回答

-2

通過不設置幀率限制或將其設置爲零(默認值),sfml窗口應該儘可能快地顯示幀。不幸的是,這個問題似乎與強制啓用vsync的驅動程序有關。因爲這是一臺Macbook Pro,帶有HD3000圖形和一個英特爾驅動程序,所以我不知道如何強制關閉vsync。

還有其他解決此問題的方法,例如使用if語句來決定是否每個循環更新屏幕。這就是我所做的,儘管這不是一個理想的解決方案。

關於SDL的延遲功能,SFML提供了一個sf::Sleep()函數。這個函數是通過一個sf::Time對象的參數來調用的,用戶可以設置該對象的微秒數,毫秒數和秒數來延遲。

但是請注意,此功能在這段確切的時間內不會「睡眠」或「延遲」 - 操作系統在「某段時間後至少在請求的睡眠時間之後」返回。我不完全理解它是如何工作的,或者你可以用sf::Sleep()SDL_Delay()實現什麼樣的「時間分辨率」。

+0

@andreasm它是不一樣的/適當的 – user3728501

1

我不確定在framerate問題。根據文件,這將起作用。我想嘗試的一件事是一次刪除(或註釋掉)一個語句,看看它是否有幫助,或者兩者兼而有之:垂直因爲應該是默認關閉的,並且我覺得幀速率會默認爲無窮大,但我可能會錯誤。此外,它可能是幀率是無​​限的,但計算只需要足夠的時間,它可以達到60fps。最後,也許這是監視器的限制,如上所述。

在延遲上,我相信你正在考慮睡眠功能 - 讓當前線程暫停一段時間。我知道在SFML 2中,這是sf :: sleep(sf :: Time),其中時間可以通過例如:sf :: seconds(float t),sf :: milliseconds等等來得到。它們返回一個Time目的。在SFML 1.6中,它是sf :: Sleep(float seconds)。另外,我不知道這是否能解決它,但我認爲SFML在Apple方面有一些問題,所以mabye,假設你使用的是1.6或更低,版本2修復了這個問題。版本2現在已經出現......好吧,你不必自己編譯它。我認爲它解決了其他問題,也許這是以前的一個問題。

+0

好吧,謝謝,我將apt-get新版本或者其他東西,看看它是否有所作爲 也沒有代碼運行爲了減慢速度,它應該只是在while循環中永久循環,將程序降低到60FPS的語句是window.Display();這是用於更新屏幕的SFML方法 – user3728501

+0

在這種情況下,它可能是某種東西其他的,我只是想知道你的物理模擬是否會減緩它的速度,在這種情況下,我猜測它是顯示器/ vsync。 – 2012-12-25 19:53:20

3

雖然您可以使用SFML取消/激活VSync,但不能保證它實際上會被激活,因爲驅動程序本身具有最後一個詞,並且它們通常會提供強制啓用或禁用VSync的選項。所以我會說你應該看看你的圖形驅動程序的設置。

然後我想知道你實際上想用'無限制'的幀率來實現,因爲它大部分只是最大化你的CPU的一個核心,儘管應用程序實際上並沒有做任何事情。如果你只是需要更多的CPU時間來計算東西,那麼兩種方法(VSync & setFramerateLimit())都不應該阻塞任何東西。

我強烈建議你使用SFML 2,因爲SFML 1.6在2.5年以上沒有被維護,有不少醜陋的bug並且缺少一些非常有用的特性(例如RenderTexture,VertexArray,...)。

+0

好吧,謝謝,我下載了SFML 2.0,但無法弄清楚如何設置它在xubuntu上......應該有一個makefile或者其他東西,但是沒有一個...... :( 非限制幀率的原因是我將能夠保持一個任意的幀速率,而不用等待下一幀的CPU時間。延遲是爲了防止能夠移動窗戶和其他東西的問題。 – user3728501

+0

[官方教程](http://www.sfml-dev.org/tutorials/2.0/compile-with-cmake.php)的存在是有原因的... SFML使用構建系統CMake,而CMake會生成一個makefile或一個項目文件。對於幀速率,您應該將渲染和物理分離,以便您可以以固定速率運行物理,並且僅在圖像也會顯示時才顯示。 – Lukas

+0

目前沒有物理運行。有一個調用窗口顯示的無限循環,因此我預計它將以超過60FPS的速度運行,並期望看到一個CPU核心執行接近100%。這沒有發生,這是問題所在。 – user3728501