我一直在研究实现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,该框架永远不会更新。是什么原因造成的?是否存在可能导致这种情况的已知状况?

最佳答案

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
    }
    

    关于c++ - DXGI API:AcquireNextFrame()从不获取更新的图像,始终为空白,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51681923/

    10-09 13:27