在辅助显示器上的高CPU使用率(窗口模式)

时间:2012-05-11 12:40:43

标签: delphi windows-xp direct3d direct3d9

我们的自定义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的代码我找不到与我如何做的任何显着差异。

谢谢!

1 个答案:

答案 0 :(得分:0)

您是否尝试将BackBufferFormat设置为Caps.BackBufferFormat? 据我所知,xrgb不是通用格式,某些分辨率可能不支持。