2012-01-08 9 views
7

これを妥当な例に減らす前に、誰かがこの問題に遭遇した可能性があり、問題を明らかにすることを望んでいました。Vista/7のOpenGL最大32画面画面

私はウィンドウごとに1つのOpenGLコンテキストを使用する32ビットのCベースのアプリケーションがあり、すべてのコンテキストとウィンドウは同じように設定されています。要求されたピクセルフォーマットは、32ビットカラー、アルファ、デプスバッファ、アクセラレーション済みです。 Windows 2000とXPでは、すべてが完璧に機能します。

33番目のウィンドウ/コンテキストのペアが作成されるまで、すべてVistaと7で完全に機能します。ウィンドウの作成にはエラーはありません。コンテキストにはエラーはなく、コンテキストには現在のエラーはなく、描画にはエラーはなく、SwapBuffersはエラーを生成しません。しかし、OpenGLのコンテキストでは出力が生成されず、Aeroではウィンドウが白く、古典的なモードでは描画されず画面のゴミだけになります。 DWMを強制終了しても問題は解決されず、異なるピクセル形式(単一バッファ、差分など)が試されますが、PFD_SUPPORT_COMPOSITIONは問題を解決しません。これは、Vista/7を搭載した数多くの異なるマシン上にあり、決してXPではありません。

バックバッファをglReadPixelsでき、それらは正しいピクセルです。同じコンテキストでpbufferにレンダリングすると問題はなくなりますが、> 32 pbuffersにレンダリングしても問題ありません。

画面上のコンテキスト/ウィンドウの操作を自由にすると、動作していないウィンドウが再び機能し始めます。これは、32個のウィンドウが画面上に表示された後、Vista/7が単にOpenGLレンダリングの表示を停止しているかのようです。

ピクセルフォーマット記述子にPFD_SUPPORT_GDIが含まれている場合は、すべて正常ですが、受け入れられないソフトウェアレンダラーを使用しています。

これがVista/7のOS制限またはドライバ制限であるかどうか疑問に思っています。どんな洞察もありがとう。

+0

とかなり似ている

注意行動は何ですか? – Luca

+2

これは、これが責任を負う特定のドライバ実装だと思われます。あなたは複数のカード/メーカーで同じ動作をしていますか? – eodabash

答えて

2

制限は実装固有のものであり、できることは共通のハードウェアでいくつかのテストを実行することです。

私はいくつかのテストを自分で実行しましたが、これはGeForceカードの制限がかなり高いことが判明しました。デスクトップQuadroでは、正しく再塗りつぶしできたコンテキストは128個でしたが、プログラムはエラーなしで128個のコンテキストを作成できましたが、ウィンドウにはゴミが含まれていました。私はPFD_SUPPORT_GDIを使用していません。

ATi Radeon 6950では、ウィンドウ105で再描画が中止され、描画コンテキスト#200の作成が失敗しました。

あなた自身で試してみたい方は、Max OpenGL Contexts test(完全なソースコード+ win32バイナリがあります)のプログラムをご覧ください。たぶんあなたは、コードを見て、犯人を追跡することができます、それについて聞いて非常に興味があります。

これが結果です。 1つのアドバイス - 可能な場合は複数のコンテキストを使用しないでください。マルチコンテキストで動作するアプリケーションでは複数のコンテキストを理解できますが、1つのモニタ上のアプリケーションは単一のコンテキストに依存する必要があります。コンテキストの切り替えが遅い。それだけではありません。 OpenGLウィンドウと他のウィンドウが重なっているアプリケーションでは、ハードウェアクリッピング領域が必要です。 GeForceにはハードウェアクリッピング領域が1つ、Quadroには8つ以上の領域があります(CADアプリケーションでは、ゲームとは対照的に、OpenGLウィンドウと重なるウィンドウとメニューがよく使用されます)。より多くの領域が必要な場合は、レンダリングがソフトウェアに戻ってしまうので、OpenGLのウィンドウ(コンテキスト)がたくさんあることはあまり良い考えではありません。あなたは同じユニークなコンテキストに取り付けた33個のウィンドウを作成する場合、これはIs there a limit to how many OpenGL rendering contexts you can create simultaneously?