2012-01-08 22 views
7

在我將這個減少到一個合理的例子之前,我希望有人可能會遇到這個問題,並可以解決這個問題。OpenGL最多32個帶Vista/7的屏幕上的窗口

我有一個基於32位C的應用程序,每個窗口使用一個OpenGL上下文,所有的上下文和窗口設置相同。請求的像素格式是32位顏色,alpha,深度緩衝區,加速。一切都在Windows 2000和XP上完美運行。

一切都在Vista和7上完美運行,直到第33個窗口/上下文對被創建。創建窗口沒有錯誤,創建上下文沒有錯誤,使上下文當前沒有錯誤,繪圖不會產生錯誤,SwapBuffers不會產生錯誤。然而,OpenGL上下文無法產生任何輸出,Aero的窗口是白色的,它們沒有繪製的經典模式,只是屏幕垃圾。殺死DWM並不能解決這個問題,嘗試使用不同的像素格式(單個緩衝區,差異深度等),而PFD_SUPPORT_COMPOSITION不能解決問題。這是在Vista/7的許多不同的機器上,從來沒有XP。

我可以glReadPixels後臺緩衝區,他們是正確的像素。渲染到具有相同上下文的pbuffer可以正常工作,渲染到> 32個pbuffers是很好的。

如果我自由工作在屏幕上下文/窗口,非工作窗口再次開始工作。就好像Vista/7只是在屏幕上顯示32個窗口後停止顯示OpenGL渲染一樣。

如果像素格式描述符包含PFD_SUPPORT_GDI,則一切正常,但它使用的軟件渲染器不可接受。

我想知道這是否是Vista/7中的操作系統限制或驅動程序限制。感謝您的任何見解。

+0

什麼行爲,如果您創建連接到同一個獨特的背景33個窗口? – Luca 2012-01-08 09:54:28

+2

我懷疑這是一個特殊的驅動程序實施,這是應該責備。您是否在多個卡/製造商中看到相同的行爲? – eodabash 2012-01-10 06:43:47

回答

2

該限制是特定於實現的,您只能在通用硬件上運行一些測試。

我自己做了一些測試,結果證明GeForce顯卡的極限是非常高的(甚至可能沒有限制)。對於臺式機Quadro,有128個上下文的限制能夠正確重新繪製,該程序能夠創建128個更多上下文而沒有錯誤,但窗口包含垃圾。我沒有使用PFD_SUPPORT_GDI。

ATi Radeon 6950更令人感興趣,在#105窗口停止重繪,並且創建渲染上下文#200失敗。

如果你想自己嘗試,可以在這裏找到該程序:Max OpenGL Contexts test(有完整的源代碼+ win32二進制文件)。也許你可以查看代碼並追蹤肇事者,聽到這個消息會非常感興趣。

這就是結果。一條建議 - 儘可能避免使用多個上下文。在多監視器上運行的應用程序中可以理解多個上下文,但單個監視器上的應用程序應該使用單個上下文。上下文切換很慢。而這還不是全部。 OpenGL窗口與另一個窗口重疊的應用程序需要硬件剪切區域。 GeForce上有一個硬件剪裁區域,Quadro上有八個或更多的區域(CAD應用程序通常使用與OpenGL窗口重疊的窗口和菜單,與遊戲相比)。如果需要更多的區域,渲染會回落到軟件 - 如此重複 - 有很多OpenGL窗口(上下文)並不是一個好主意。

注意這是相當類似Is there a limit to how many OpenGL rendering contexts you can create simultaneously?