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 быть ненулевым.

Фрагмент кода имеет две проблемы:

  1. hr проверка против нуля не совсем точна
  2. нет соответствия 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
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector