在Windows應用程序中,我有多個OpenGL窗口同時打開。理想情況下,我希望每個都以60 fps進行繪製,並同步到屏幕刷新。將多個OpenGL窗口同步到vsync
對於每個渲染上下文,我打電話wglSwapIntervalEXT(1)
打開vsync。每個窗口都有自己的顯示線程,該線程繪製框架,然後調用SwapBuffers
進行更新。
事實證明,窗戶彼此「打架」:它看起來像SwapBuffers
調用是同步的,並等待對方,即使它們在單獨的線程。我正在測量每個窗口和兩個窗口的幀到幀時間,這將下降到30 fps,以3到20 fps等。
如果我用wglSwapIntervalEXT(0)
關閉vsync,它們會愉快地刷新爲60 fps無論我打開多少個窗口。但是打開一個窗口,這並不像打開vsync那樣平滑。
有什麼方法可以用OpenGL來實現我想要的嗎?
如果你考慮這個問題,你會意識到如果你將它們全部同步到刷新率,他們必須相互同步。您看到的每個窗口都沒有唯一的刷新事件。我能想到的唯一解決方案就是使用一個窗口,並使用視口在其中創建自己的窗口管理器。 – Robinson 2012-04-07 12:01:47
如果SwapBuffers只是表示需要交換緩衝區,它可能會立即返回(直到寫入新的後臺緩衝區,這將需要阻止)。然後,顯示驅動程序所擁有的單獨線程可以等待vsync,並在正確的時刻交換標記爲需要交換的所有緩衝區。但是,顯然這不是如何工作的... – 2012-04-10 14:13:25