2016-07-03 8 views
6

Per-Monitor DPI-Aware Direct2Dアプリケーションを作成したいと思います。 Microsoftの"First Direct2D Program"の例をWM_DPICHANGEDのように扱い、Kenny Kerr's MSDN articleで説明したように拡張しました。これは、両方のモニターが1つのビデオカードを使用しているときに動作しますが、ラップトップのNVIDIA Optimusセットアップを使用しているときに不具合が発生します。Per-monitor DPI-Aware:NVIDIA Optimusでの黒いウィンドウグリッチ

私はこれらのステップとPer-Monitor Aware WPF Sampleを実行することで、同じ不具合を再現することができます。各モニターに倍率

  • 異なるDPI。
  • Optimusが有効になっている(内蔵グラフィックスのラップトップディスプレイ、Quadroカードの外部モニタ)
  • アプリケーションはプライマリディスプレイ(右の外部モニタ)から起動します。
  • これを左にドラッグすると、DPIの変更が適切に処理されます。
  • 右にドラッグします。 DPIの変更を処理すると、右側のモニタのウィンドウの一部が黒くなります。左の部分はまだ適切に描かれています。

video of this bugを参照)

私は上記の例のアプリでこのバグを見ている、と私はシンプルな例にカーのWM_DPICHANGEDハンドラを追加しようとします。疑わしいことに、私はがあります。他のアプリ(Chrome、Visual Studio自体)にも同様の黒いウィンドウが表示されますが、モニター間をドラッグしてすばやく最大化すれば、一時的にしか表示されません。

だから誰もこのグリッチに精通していますか?ディスプレイドライバのバグですか?あるいは、他のアプリがそれを修正するために何かしていますが、サンプルコードはそうではありませんか?

+1

ドライバのバグに備えて、ディスプレイドライバのアップデートを試しましたか? –

+0

はい、私はNvidiaのドライバ354.42と最新の368.39を試しました。しかし、(あなたの潜在的な将来の質問を予期する)私は、私が保存した最も古いバージョン、332.21を試して、驚き - 不具合はありません。 (その古いドライバはWindows 10よりもずっと前からそうだと率直に言って、それはまったくうまくいっていない)。 – Lack

+0

NVIDIAは、「アプリケーションをドラッグすると、なぜ「アーティファクトや黒い画面が表示されるのですか」(https ://nvidia.custhelp.com/app/answers/detail/a_id/2757)。これは、「アプリケーションは、中断することなく移行するためにディスプレイアダプタの変更を適切に処理する必要があります」と述べています。私はもっ​​と混乱しています。アプリが常に*明示的にアダプターを処理しなければならないのは簡単でしょうが、グリッドは特定のドライバーバージョンでのみ発生し、DPI変更のサイズを変更しようとするときにのみ発生します。 – Lack

答えて

3

NVIDIA Optimus you say?それらの運転手は罪のようにバギーです。レンダーターゲットをD2D1_PRESENT_OPTIONS_RETAIN_CONTENTSフラグで初期化してみてください。

これは私がPaint.NET 4.0を終えた時に戻って2014年に把握するために永遠に連れて行ってくれたものだった、と私はまだそれをオフにしないように私を警告コード内のコメントを持っている:

private PresentOptions hwndPresentOptions = 
    PresentOptions.Immediately | 
    PresentOptions.RetainContents; // If we don't use RetainContents, then we get awful 
            // black flickering and mouse trails on some hardware 
            // (e.g. NVIDIA Optimus) 
+0

このフラグを 'CreateHwndRenderTarget'呼び出しに追加してもすぐに問題は解決されませんでしたが、私が深く掘り下げたときにこれを覚えておきます。ありがとうございました。 – Lack

関連する問題