gpt4 book ai didi

c++ - DXGI API : AcquireNextFrame() never grabs an updated image, 总是空白

转载 作者:行者123 更新时间:2023-11-30 04:58:21 25 4
gpt4 key购买 nike

我一直在研究实现 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 是否为非零。

代码片段有两个问题:

  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
}

关于c++ - DXGI API : AcquireNextFrame() never grabs an updated image, 总是空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51681923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com