カスタム DirectShow ビデオ レンダラーは Direct3D9 を使用します。プライマリ ディスプレイ/モニターでウィンドウ モード (ディスプレイの表面全体をカバー) で表示すると、CPU 使用率が低くてもパフォーマンスは良好ですが、セカンダリ モニターで表示すると、DirectX が CPU を使用して CPU (カーネル) 使用率が非常に高くなります。デバイス間の転送を行います。これは、Windows XP でのみ発生します。適切なアダプターを使用して Direct3DDevice9 を作成します。少なくとも私はそうだと思います。まず、指定されたウィンドウ ハンドルのモニター ハンドルを取得し、GetAdapterMonitor() を使用して、このモニターに対応する D3D アダプターを検索します。ウィンドウを移動してデバイスを再初期化すると、予想どおり、アダプタが 0 から 1 に変化することがわかります。他にすべきことはありますか?関連するコードは次のとおりです(Delphi)。
Adapter := D3DADAPTER_DEFAULT;
if (FWnd <> 0) and (FWnd <> INVALID_HANDLE_VALUE) then
begin
monitor := MonitorFromWindow(FWnd, MONITOR_DEFAULTTONEAREST);
for idxAdapter := 0 to D3D.GetAdapterCount - 1 do
if D3D.GetAdapterMonitor(idxAdapter) = monitor then
begin
Adapter := idxAdapter;
Break;
end;
end;
Result := D3D.GetDeviceCaps(Adapter, D3DDEVTYPE_HAL, Caps);
PP.BackBufferCount := 1;
PP.BackBufferFormat := FFormat; // xrgb
PP.BackBufferWidth := FWidth;
PP.BackBufferHeight := FHeight;
PP.Flags := D3DPRESENTFLAG_VIDEO;
PP.PresentationInterval := D3DPRESENT_INTERVAL_ONE;
PP.SwapEffect := D3DSWAPEFFECT_DISCARD;
PP.hDeviceWindow := FWnd;
PP.Windowed := not FFullScreen;
D3D.CreateDevice(Adapter, D3DDEVTYPE_HAL, FWnd, D3DCREATE_MULTITHREADED or D3DCREATE_MIXED_VERTEXPROCESSING, @PP, Device);
他のプレーヤーとレンダラーには、この問題はありません。MPC-HC と madVR にはこの問題がありましたが、修正されました。MPC-HC のコードを見ると、私がやっている方法との大きな違いは見つかりません。
ありがとう!