Windows 10 屏幕截图 DXGI 屏幕截图

Windows 10 Screen snip DXGI screenshot

我正在处理 DXGI 屏幕截图,google 上有很多示例,它们工作正常(例如 https://github.com/pgurenko/DXGICaptureSample/blob/master/DXGICaptureSample/DXGIManager.cpp)。然后我发现 Windows 10 内置屏幕截图工具,有兴趣检查它是否使用 DXGI。在 windbg 中加载它之后,我看到它按预期调用 D3D11!D3D11CreateDevice 和 dxgi!CDXGIAdapter::EnumOutputs,但它从来没有像我能找到的所有示例代码那样调用 dxgi!CDXGIOutput::DuplicateOutput。所以问题是它如何捕获屏幕?

简而言之,DXGI 捕获屏幕的方式是首先接收指向屏幕的二维纹理的指针,该指针在 GPU 中称为帧缓冲区。然后该指针(连同纹理高度、宽度等描述)从 GPU 读取并将数据复制到 CPU 内存。这就是为什么人们在开始流式传输时帧率会受到影响,因为总线(CPU 和 GPU 之间的连接)不是很大。此图像现在存在于 GPU 和 CPU 内存中,直到帧缓冲区被覆盖时的下一个绘制调用。

使用 DXGI 进行一些在线快速搜索 (https://docs.microsoft.com/en-us/windows/win32/direct3darticles/dxgi-best-practices) 可能是“让开发人员头疼”的事情。我的建议是检查屏幕的格式,看看它是否干扰了 DXGI。在复制的同一帧上更改帧缓冲区中的任何内容可能会导致问题。