DXGI API: AcquireNextFrame() никогда не получает обновленное изображение, всегда пустое
Я играл с чужим кодом, который реализует API дублирования рабочего стола DXGI, и столкнулся со странной проблемой. Вот ссылка github на код, который я использую.
https://github.com/diederickh/screen_capture/blob/master/src/test/test_win_api_directx_research.cpp
Весь код работает до тех пор, пока я не попытаюсь посмотреть, что находится в D3D11_MAPPED_SUBRESOURCE map.pData, где все, что я получаю, это пустой экран, в частности, это повторяющийся набор 0xFF000000, черный с полной альфа-версией. Оглядываясь на другие решения, я обнаружил, что кто-то решил эту проблему, используя цикл while, чтобы проверить, когда фрейм успешно обновляется.
while (true)
{
hr = duplication->AcquireNextFrame(INFINITE, &frame_info, &desktop_resource);
if (hr && frame_info.LastPresentTime.QuadPart)
{
break;
}
}
Однако когда я запускаю этот код, консоль никогда не завершается и продолжает работать вечно. По-видимому, согласно frame_info.LastPresentTime.QuadPart, кадр никогда не обновляется. Что может быть причиной этого? Есть ли известное состояние, которое может вызвать это?
1 ответ
IDXGIOutputDuplication::AcquireNextFrame
есть веские причины возвращаться без рамки. Так что это правда, вам может понадобиться сделать несколько попыток и проверить LastPresentTime
быть ненулевым.
Фрагмент кода имеет две проблемы:
hr
проверка против нуля не совсем точна- нет соответствия
ReleaseFrame
для успешногоAcquireNextFrame
вызов
Так вот об этом:
while (true)
{
hr = duplication->AcquireNextFrame(INFINITE, &frame_info, &desktop_resource);
if (FAILED(hr))
{
// TODO: Handle error
}
if (frame_info.LastPresentTime.QuadPart)
{
break;
}
duplication->ReleaseFrame(); // TODO: check returned value here as well
}