Directx Windows 10屏幕剪切DXGI屏幕截图

Directx Windows 10屏幕剪切DXGI屏幕截图,directx,screenshot,gdi,directx-11,dxgi,Directx,Screenshot,Gdi,Directx 11,Dxgi,我正在做DXGI截图,谷歌上有很多例子,它们都很好用(比如)。然后我找到了Windows10内置的屏幕剪切工具,并有兴趣检查它是否使用DXGI。在windbg中加载后,我看到它调用D3D11!D3D11CreateDevice和dxgi!CDXGIAdapter::EnumOutputs与预期一样,但它从不调用dxgi!CDXGIOutput::DuplicateOutput与我能找到的所有示例代码一样。那么问题是它如何捕获屏幕呢?简单地说,DXGI捕获屏幕的方式是首先接收一个指向屏幕2d纹理的

我正在做DXGI截图,谷歌上有很多例子,它们都很好用(比如)。然后我找到了Windows10内置的屏幕剪切工具,并有兴趣检查它是否使用DXGI。在windbg中加载后,我看到它调用D3D11!D3D11CreateDevice和dxgi!CDXGIAdapter::EnumOutputs与预期一样,但它从不调用dxgi!CDXGIOutput::DuplicateOutput与我能找到的所有示例代码一样。那么问题是它如何捕获屏幕呢?

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


仅仅使用DXGI进行一些快速的在线搜索()就可能成为“开发人员的头痛问题”。我的建议是检查屏幕的格式,看看它是否干扰了DXGI。在复制的同一帧上更改帧缓冲区中的任何内容都可能导致问题。

谢谢您的解释,capslpop。但我想知道ScreenSnip在DXGIAPI级别是如何工作的。我还发现我调试的ScreenClippingGhost.exe是从Win10 20H1开始引入的,它以前应该是explorer中的一个组件。