2012-03-26 30 views
4

我的應用程序可以快速渲染(通常每幀1-6毫秒),雙緩衝和同步到vblank啓用。在我的主循環中,我想睡10毫秒左右,然後讀取一些實時輸入並儘可能晚地進行渲染,同時仍然在截止日期之前更新幀(對於實時60 FPS渲染,延遲時間最短)。尋找OpenGL的垂直回掃時間

我可以交換緩衝區但不幸的是在某些系統上使用後glfinish在(Linux的非合成,至少)這似乎等不只有等到下一個緩衝交換,但直到圖像已經發出了HDMI端口(總等待25毫秒的範圍,應用程序以30 FPS運行)。在其他系統上(Linux複合),這種方法工作正常。沒有glFinish更多的工作被緩衝,造成更長的延遲,所以這也不好。

我對更精確的幀定時有什麼選擇?主要平臺爲Windows,Linux和OS X.

+1

對啓用了垂直同步的幀進行定時是沒有意義的。 – Thomas 2012-03-26 02:06:24

+0

它可以啓用同步工作,但我很樂意做沒有,太 - 只要有(當然,沒有撕裂,)的可靠方法。 – Tronic 2012-03-26 02:55:05

+0

在OS X,你可以使用['CGDisplayModeGetRefreshRate'(http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/Quartz_Services_Ref/Reference/reference.html)。 – user1118321 2012-03-26 05:17:17

回答

2

我想睡大約10毫秒,然後讀取一些實時輸入並儘可能晚地進行渲染,同時仍然在截止日期之前更新幀(對於固體60 FPS渲染,延遲最小)。

這是一種非常不可靠的方法。我建議你把所有的渲染操作放到它們自己的線程中,這會阻塞緩衝區交換直到交換髮生。在所有輸入數據被計算的單獨線程中執行所有輸入處理。在進行交換之前,您應該在處理線程上解除互斥鎖或信號量,這是緩衝區交換期間的事情。

請記住,您不應該延遲渲染實用程序非常接近的V-Sync,因爲這可能會導致您錯過它。相反,你應該在垂直回溯時間間隔開始時假設你有75%的時間用於渲染你的東西,而其餘的25%應該保留爲緊急餘量。另外,如果你正在運行一個合成器,這個也需要一些GPU的時間。

如果您提前或延遲渲染,視覺效果沒有區別。如果你關心你的模擬時間:姑且你居然會做出最後期限,使模擬的狀態時,它會在V-Sync的時間。在任何數據輸入上使用Kalman filter進行模擬,以便根據預測進行渲染並「僅」調整新輸入。

交換緩衝區後,但不幸的是在某些系統(Linux的非合成,至少)這似乎等不只有等到下一個緩衝交換,但直到圖像已經發出了HDMI端口,我可以使用glfinish在(總計等待時間爲25 ms,應用程序以30 FPS運行)。

如果您的時序錯過了V-Sync,則會發生這種情況:SwapBuffers將等待完整的垂直回掃期。恕我直言SwapBuffers應該添加某種超時參數,但到目前爲止它沒有。

+0

非常好的答案。有一點需要補充:glFinish真的沒有意義。正確的做法正如datenwolf所說:渲染儘可能快,考慮GPU和輸出黑盒子。不要試圖用它作爲時鐘。渲染可能會被許多無法控制的緩衝區延遲。請參閱:http://superuser.com/questions/419070/transatlantic-ping-faster-than-sending-a-pixel-to-the-screen獲得準確的時鐘已經足夠困難。使用它的圖形顯示是虐待的:) – starmole 2012-05-22 09:22:46