2012-04-06 83 views
6

在Windows應用程序中,我有多個OpenGL窗口同時打開。理想情況下,我希望每個都以60 fps進行繪製,並同步到屏幕刷新。將多個OpenGL窗口同步到vsync

對於每個渲染上下文,我打電話wglSwapIntervalEXT(1)打開vsync。每個窗口都有自己的顯示線程,該線程繪製框架,然後調用SwapBuffers進行更新。

事實證明,窗戶彼此「打架」:它看起來像SwapBuffers調用是同步的,並等待對方,即使它們在單獨的線程。我正在測量每個窗口和兩個窗口的幀到幀時間,這將下降到30 fps,以3到20 fps等。

如果我用wglSwapIntervalEXT(0)關閉vsync,它們會愉快地刷新爲60 fps無論我打開多少個窗口。但是打開一個窗口,這並不像打開vsync那樣平滑。

有什麼方法可以用OpenGL來實現我想要的嗎?

+0

如果你考慮這個問題,你會意識到如果你將它們全部同步到刷新率,他們必須相互同步。您看到的每個窗口都沒有唯一的刷新事件。我能想到的唯一解決方案就是使用一個窗口,並使用視口在其中創建自己的窗口管理器。 – Robinson 2012-04-07 12:01:47

+0

如果SwapBuffers只是表示需要交換緩衝區,它可能會立即返回(直到寫入新的後臺緩衝區,這將需要阻止)。然後,顯示驅動程序所擁有的單獨線程可以等待vsync,並在正確的時刻交換標記爲需要交換的所有緩衝區。但是,顯然這不是如何工作的... – 2012-04-10 14:13:25

回答

0

您可能能夠獲得輸出設備並在線程的循環中使用WaitForVBlank函數。然後,您可以爲您感興趣的每個窗口發佈消息或信號事件。

+0

問題是我不直接控制其他OpenGL窗口。 – 2012-05-07 08:39:23

1

在Linux中,由於調用各種線程的視頻功能,我的應用程序出現了很多奇怪的行爲。

我解決了這些問題,只使用一個線程來顯示應用程序的開始,創建窗口,創建glcontext等,並使用信號量和隊列來共享此線程與其他線程之間的數據。