3

私は数年前に無料のゲームを書きました: http://www.walkover.org . ロビーとメニューについては、win32 のような通常のダイアログを使用します。実際のゲームが起動すると、OpenGL が使用されます。

現在、Windows 7 では、実際のゲームが開始されると Windows エアロ ガラスがオフになり、ゲームが終了すると再びオンになります。

これを防ぐためにできることはありますか?ガラスがオンになっている場合にガラスをオンにしておく特別なフラグはありますか? (新しいものについては、私は DirectX を使用していますが、これは発生しません。) どこかで指定しなければならない (新しい) フラグがあるのでしょうか?

私はこのpixelformatdescriptorを使用しています:

    static PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR),  // size of this pfd
        1,                              // version number
        PFD_DRAW_TO_WINDOW |            // support window
          PFD_SUPPORT_OPENGL |          // support OpenGL
          PFD_DOUBLEBUFFER,             // double buffered
        PFD_TYPE_RGBA,                  // RGBA type
        32,                             // 24-bit color depth
        0, 0, 0, 0, 0, 0,               // color bits ignored
        0,                              // no alpha buffer
        0,                              // shift bit ignored
        0,                              // no accumulation buffer
        0, 0, 0, 0,                     // accum bits ignored
        0,                              // 32-bit z-buffer
        0,                              // no stencil buffer
        0,                              // no auxiliary buffer
        PFD_MAIN_PLANE,                 // main layer
        0,                              // reserved
        0, 0, 0                         // layer masks ignored
    };
4

4 に答える 4

5

この問題は、次のすべてが原因で発生します。

  • ウィンドウズ7
  • OpenGL
  • 画面の四角形に正確に一致するウィンドウを作成する(フルスクリーン)
  • Swap Buffers の 2 回目の呼び出し
  • 古いグラフィックス カード ドライバ

私は同じ問題を抱えており、OpenGL を使用する 2 つの AAA ゲーム エンジンをテストしたところ、両方に同じ問題があることを確認できました。DirectX は影響を受けないようです。

これは、ウィンドウの作成に問題がないことを意味します。コードの問題ではありません。

問題を解決するには、グラフィック カード ドライバーを更新することをお勧めします。

私が見つけた短期的な回避策は、画面の解像度よりも 1 ピクセル大きいウィンドウを作成することでした (幅または高さのいずれか)。

これにより、ウィンドウがフルスクリーンになったことを検出しないようになり、問題は発生しません。

于 2011-09-20T19:13:52.503 に答える
1

これは、Aero Glass と互換性のない OpenGL レンダリング コンテキストを作成した場合に発生する可能性があると思います。これを引き起こす可能性のある IIRC のケースの 1 つは、16 ビット カラーを使用してウィンドウを作成した場合です。Aero グラスは 16 ビット カラーでレンダリングできないため、何らかの技術的な理由により、Windows は (アプリだけがそれを使用している場合でも) Aero グラスを完全に無効にする必要があります。32 ビットカラーを使用してみてください。

同様の理由でそれを無効にする他の設定があるかもしれません。つまり、OpenGL を作成しているすべての設定を再確認し、「デスクトップがこのモードに切り替えられた場合、Aero Glass がオフになるかどうか」を考えてみてください。

于 2010-04-22T12:49:25.003 に答える
0

あなたが何をしているのか正確にはわかりませんが、おそらくそれも同様です.MicrosoftのWindows 7でのOpenGLの実装は、うまく言えば完璧ではありません. 実際、私の OpenGL コードのほとんどで、明示的に DWM をオフにしています。そうしないと、Microsoft の実装のバグにより、基本的にまったく機能しなくなります。他の方法である程度回避することはできますが、パフォーマンスが非常に低いため、とにかくコードが本質的に使用できなくなります (深刻な測定は行っていませんが、すぐに推測すると、少なくとも 5:1 のパフォーマンス損失と言えます)。 .

于 2010-04-20T04:28:15.630 に答える
0

ウィンドウ DC から BitBlt を実行しようとすると、GDI が OpenGL でレンダリングされたウィンドウの内容を読み取れないという問題がアプリケーションで発生したことがあります。これは、Vista が登場したばかりの頃のことです。PFD_SUPPORT_GDI を使用するとこれを回避できますが、Aero も無効になります。この問題により、多くの古いアプリが壊れてしまったので、場合によっては強制的にオンにする必要があったと思います。ここであなたのケースが何であるかわかりません。ドライバースタブの問題に賭けます。

OpenGL、Aero、および GDI に関する私自身の限られた経験です。

于 2012-03-09T10:01:32.173 に答える