D3D / DXGIは全画面遷移を処理します


9

D3D11アプリケーションがあり、適切なフルスクリーンサポートを追加したい。これで、DXGIでウィンドウを全画面表示に切り替えることができます。スワップチェーンをブリットする代わりに、フロントチェーンとバックバッファーをフリップするために必要なすべてをDXGIが処理するという印象を受けました。

ただし、DXGIにスイッチを実行させると、マルチモニターセットアップでは信頼性が低いようです。切り替え後のセカンダリ画面は、明確な理由やパターンがないため、長時間にわたって完全に真っ黒のままです。

フルスクリーンウィンドウ残りのデスクトップが他の画面に表示されるまで、数回切り替えて切り替える必要があります。

どうやら私はこれだけではないようですが、Battlefield 3とWoWには多くの人にとって同様の問題があるようです。

さて、実際の質問:これらのAAAゲーム開発会社でさえこれを機能させることができないので、私の最大の望みは、どういうわけか自分でフルスクリーンに切り替えることです。

ウィンドウ/スワップチェーンを適切なバッファフリッピングフルスクリーンモードに上げるためにできることはありますか?


この記事の執筆時点では、World of Warcraftの現在のバージョンには、あなたが言及した表示モードの構成の問題やメモリリークはありません。それらは確かに問題がありましたが、7.3.2の時点で修正されています
Gazer

回答:


3

私の知る限り、機能するのは次のとおりです。

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

アプリケーションの開始時、および:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

やめる前に。移行については、通常どおり続行します。InvalidateRect(NULL, NULL, true)全画面表示に切り替えた直後に試しましたが、役に立ちませんでした。お役に立てれば。


すべてを試した後、あなたは正しいようです。確実にコンポジションを無効にすると、これが発生しなくなります。私が望んでいた答えではありませんが、何もないよりはましです。

Windows 8.1以降はこの設定を無視することに注意してください。DWMを無効にすることはできません。
チャックウォルボーン

1

この問題に直面しているのはあなただけではありません。最初に確認すること:使用しているビデオカードに最新の/ beta / top-notchドライバーを使用していることを確認してください。

今、私はそこだけだと言うだろう小さなあなたは、これが自動DXGIの実装よりも良く働いて得ることができる可能性が。この種の問題は、アダプターのベンダー、ドライバーのバージョン、およびモニター構成に大きく依存します。したがって、1台のマシンで修正することにより、さらに多くのマシンで破壊される可能性があります。

手作業ですべてを行わなければならなかったDirectX 9の暗い時代に戻ることはお勧めしません。自動切り替えを修正することをお勧めします。従うべきいくつかの道:

  • (スパース)ドキュメントを注意深く読みます。

  • まだ行っていない場合はWM_SIZEここで説明するように、フルスクリーンから、またはフルスクリーンに切り替えたときに受け取るイベントに応答してみてください。その場合ResizeBuffersで説明されているように呼び出す前に、バックバッファへのすべての参照を適切に解放していることを確認してください。そうしないと、この種の奇妙な問題が発生する可能性があります。

  • 全画面で直接開始して、列挙された表示モードのいずれかでスワップチェーンを作成してみてください。これが常に機能する場合、これは、処理時に列挙型表示モードのいずれかを使用していないことを意味している可能性がありますWM_SIZE(または、完全にではなく、リフレッシュレートなどが重要になる場合があります)。

  • スワップエフェクトとスワップチェーン記述のバッファ数をいじってみてください。おそらく> DXGI_SWAP_EFFECT_SEQUENTIALBufferCount2 を使用しているはずです。おそらく、より「エキゾチック」なオプションに対するドライバのサポートが不十分です。


バッファのサイズを変更しても問題はありません。私はすべてのスワップエフェクトも試してみましたが、違いはないようで、常に2つのバッファーを使用しました。私はフルスクリーンのものを試してみます(「列挙型表示モードの1つを使用する」とはどういう意味かわかりませんが-WM_SIZEに応答するとき、私が行うのはResizeBuffersだけで、表示モードを引数として渡す場所はありません。 )しかし、私は自然に..私は今、問題を複製することはできません、Windowsの8をインストールし、何を推測する

windows7に戻り、最初からフルスクリーンでスワップチェーンを作成してみましたが、問題は解決しません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.