DXGI API:AcquireNextFrame()从不抓取更新的图像,始终为空白

问题描述 投票:1回答:1

我一直在玩别人的代码来实现DXGI桌面复制API,我遇到了一个奇怪的问题。这是我正在使用的代码的github链接。

https://github.com/diederickh/screen_capture/blob/master/src/test/test_win_api_directx_research.cpp

所有的代码工作正常,直到我试图看到D3D11_MAPPED_SUBRESOURCE map.pData中的所有内容我得到的是一个空白屏幕,特别是它是一个重复的0xFF000000集,黑色在完整的alpha。寻找其他解决方案,我发现有人使用while循环来检查框架成功更新的时间。

while (true)
{
    hr = duplication->AcquireNextFrame(INFINITE, &frame_info, &desktop_resource);
    if (hr && frame_info.LastPresentTime.QuadPart)
    {
        break;
    }
}

但是,当我运行此代码时,控制台永远不会退出并继续运行。显然,根据frame_info.LastPresentTime.QuadPart,帧永远不会更新。可能是什么导致了这个?是否存在可导致此问题的已知情况?

c++ desktop directx-11 dxgi desktop-duplication
1个回答
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
}
© www.soinside.com 2019 - 2024. All rights reserved.