2010-02-08 88 views
6

我正在尋找一種可移植的方式來創建一個無阻塞的SwapBuffers(),即使VSync被激活。
換句話說,是否可以通過事件來通知,或知道延遲到下一個VSync?無阻塞SwapBuffers()與VSync = on

+0

如果可能的話,這將是平臺特定的。所以請至少指定您的平臺。 – unwind 2010-02-08 15:49:47

+0

我想找一種實現此功能的便攜式方式(Win32/Linux/MacOSX) – 2010-02-08 15:55:48

+0

延遲到下一個vsync如何幫助您?這並不像swapbuffer調用在調用時進行交換。 – Bahbar 2010-02-08 17:54:47

回答

0

首先,你爲什麼不在框架的開頭調用SwapBuffers()?或以某種方式將管道改爲

Render(); 
    Update(); //Update before swapping buffers 
    SwapBuffers(); 

雖然OpenGL的是在你只是把它的命令在外打工,你可以做所有的更新邏輯的。

否則有幾種方法可以解決這個問題。

我知道XNA有一個ScanLine屬性,它告訴你屏幕當前正在使用哪條掃描線。我不知道OpenGL是否也暴露了這一點,但我確定它必須。 (對吧?)

使用多線程渲染。許多現代引擎專用於整個線程僅用於渲染。如果阻塞,沒關係,它不會干擾主線程。另一種更簡單的方法是在新線程上處理輸入等,這可以避免圖形上下文的複雜性。

使用triple buffering。使用三重緩衝意味着你有兩個後臺緩衝區。當您調用SwapBuffers後,屏幕可以繼續掃描前端緩衝區,並且您新完成的緩衝區正在等待,以及第三個緩衝區可供您渲染下一幀。當然,如果你已經預渲染了兩幀,SwapBuffers()將會被阻塞。