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

4

1 回答 1

3

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
}
于 2018-08-04T06:22:59.707 回答