0

カスタム 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 のコードを見ると、私がやっている方法との大きな違いは見つかりません。

ありがとう!

4

1 に答える 1

0

BackBufferFormatをCaps.BackBufferFormatに設定しようとしましたか?私の知る限り、xrgbはユニバーサル形式ではなく、一部の解像度ではサポートされていません。

于 2012-08-20T07:18:53.887 に答える