2012-05-11 2 views
0

Наш пользовательский DirectShow Video Renderer использует Direct3D9. Когда он отображается в оконном режиме (охватывающий весь экранный интерфейс) на основном дисплее/мониторе, он хорошо работает с низким потреблением процессора, но когда он отображается на вторичном мониторе, использование процессора (ядра) идет очень высоко из-за DirectX с использованием процессора выполнить передачу между устройствами. Это происходит только в Windows XP. Я создаю Direct3DDevice9 с помощью соответствующего адаптера, по крайней мере, я думаю, что я есть. Сначала я получаю дескриптор монитора для указанного дескриптора окна, а затем ищем адаптер D3D, соответствующий этому монитору, с помощью GetAdapterMonitor(). При перемещении окна и повторной инициализации устройства я вижу, что адаптер изменяется от 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, я не вижу существенных различий в том, как я это делаю.

Спасибо!

+0

Это не Delphi конкретный, только пример кода, вот почему я не добавил этот тег –

+0

Я почти уверен, что есть «Direct3D на второй вопрос монитора». Но я не мог найти его прямо сейчас. – EMBarbosa

+0

Вы прочитали эту [документацию] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb206364 (v = vs.85) .aspx)? –

ответ

0

Вы пытались установить BackBufferFormat в Caps.BackBufferFormat? Насколько я знаю, xrgb не является универсальным форматом и может не поддерживаться для некоторых разрешений.

Смежные вопросы