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
}
Другие вопросы по тегам