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 回答