我正在做DXGI截图,在谷歌上有很多例子,它们工作得很好(比如https://github.com/pgurenko/DXGICaptureSample/blob/master/DXGICaptureSample/DXGIManager.cpp)。然后我发现Windows10内置了截屏工具,并有兴趣检查它是否使用了DXGI。在windbg中加载后,我看到它像预期的那样调用了D3D11!D3D11CreateDevice和dxgi!CDXGIAdapter::EnumOutput,但它从来没有像我能找到的所有示例代码那样调用dxgi!CDXGIOutput::DuplicateOutput。所以问题是它是如何捕捉屏幕的呢?
发布于 2020-12-10 23:55:54
简单地说,DXGI捕获屏幕的方式是首先接收一个指针,该指针指向屏幕的2d纹理,称为GPU中的帧缓冲区。然后,该指针(连同纹理高度、宽度等描述)从GPU读取并将数据复制到CPU存储器。这就是为什么当人们开始流式传输时,帧速率会受到影响,因为总线( CPU和GPU之间的连接)不是很大。该图像现在同时存在于GPU和CPU ram中,直到下一次绘制调用帧缓冲区被覆盖为止。
仅仅使用DXGI做一些在线快速搜索(https://docs.microsoft.com/en-us/windows/win32/direct3darticles/dxgi-best-practices)可能是“开发人员头疼的事情”。我的建议是检查屏幕的格式,看看它是否干扰了DXGI。在复制的同一帧上更改帧缓冲区中的任何内容都会导致问题。
https://stackoverflow.com/questions/65213270
复制相似问题