0

セカンダリ スクリーンにハードウェア アクセラレータの DirectX (現時点では 9) ウィンドウを作成しようとしています。この画面は、プライマリ画面と同じグラフィック ディスプレイに接続されています (少なくとも現時点では)。

現在、ウィンドウの位置に基づいて、またはそこにドラッグしてセカンダリ スクリーンでウィンドウを開こうとすると、CPU 使用率が約 10% 跳ね上がります。これは、ウィンドウがハードウェア アクセラレーションではなくソフトウェア フォールバックに切り替わっていることを示しているようです。

マシンは、NVIDIA グラフィックス カード (これは複数のマシンで実行されるため、さまざまなカード) を実行している Windows XP であり、最新のドライバーがインストールされています。それが重要な場合は、同時にCUDAを実行して画像を生成しています。プログラミング言語は c++ で、手動でウィンドウとメッセージ キューを作成します。現在、GUI を管理するために takebox は使用していません。

ありがとう

4

1 に答える 1

2

CreateDevice を呼び出すときは、対象のモニターのインデックスを必ず使用してください。標準の D3DADAPTER_DEFAULT 値は 0 であり、これがプライマリ モニターです。そのように DirectX は少し厄介ですが、ウィンドウが CreateDevice で指定されているものとは異なるモニター上にある場合、最初のモニターを対象とするフレームバッファーでサイレントにレンダリングし、OS ウィンドウを使用して 2 番目のモニターのフレームバッファーにバッファー コピーします。マネジャー。

そのため、迅速かつ汚い解決策は、代わりに CreateDevice(1, ...) を使用することです。これは、ほとんどの場合、デュアル モニター セットアップのインデックスが作成される方法だからです。

より堅牢な解決策は、MonitorFromWindow(hwnd) を使用して、ウィンドウが最もカバーしているモニターを見つけてから、GetAdapterMonitor() を使用して同じモニター ハンドルを返すアダプターを探して、使用可能な d3d アダプターを反復処理することです。システムに 3 つ以上のモニターがある場合、または必要なモニターが事前にわからず、HWND しかない場合は、より長い方法が必要になります。

于 2011-01-07T17:23:16.080 に答える