Direct3D桌面复制: 如何从更改屏幕分辨率中恢复?

3
我正在开发一个桌面应用程序,使用IDXGIOutputDuplication接口每秒多次截取屏幕图片。每当我调用其AcquireNextFrame方法时,我会检查返回的HRESULT是否为DXGI_ERROR_ACCESS_LOST,以查看是否有某些事件使复制接口无效。我还有一个IDXGIFactory1,并使用isCurrent()检查图形设置中是否有任何更改,例如安装了新GPU(出于某种原因),连接了新监视器或更改了桌面分辨率。
当isCurrent()返回false时,我的做法是使用IDXGIFactory1重建所有的IDXGI和ID3D11接口。这意味着所有适配器、所有输出和所有复制接口都需要重建。根据cout日志,每个监视器的接口似乎都已经成功地重建了。
我的问题在于,基于我所观察到的情况,输出复制接口返回DXGI_ERROR_ACCESS_LOST代码的监视器不会恢复,即使新接口已经构建好。因此,如果Monitor A出现错误,并且稍后我从Monitor B捕获,它会给我屏幕截图。但是,如果我继续从Monitor A捕获,我将无法获得任何屏幕截图,只可能得到DXGI_ERROR_ACCESS_LOST错误代码。
我知道这听起来有点奇怪,可能在某些部分不太清楚,但到目前为止这是我能解释的最好方式。我也尝试在网上搜索,但没有找到任何有用的信息。你们有什么想法吗?
(另外,如果有帮助的话,我正在使用JNI,以便应用程序的Java代码可以访问C++的Direct3D接口。这是我在工作中做的一个项目,那里没有人知道解决方案。)
1个回答

6

好的,我继续尝试并找到了解决方案。

在重新构建所有ID3D11接口之后,桌面复制接口(IDXGIOutputDuplication)仍然无效。可能是因为在屏幕分辨率仍在更新时检索它。

我所需要做的就是在下一次调用AcquireNextFrame()返回DXGI_ERROR_ACCESS_LOST代码时再次调用IDXGIOutput1的DuplicateOutput()方法。

将此放在这里以防万一其他人有同样的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接