【问题标题】:Windows 10 Screen snip DXGI screenshotWindows 10 屏幕截图 DXGI 截图
【发布时间】:2021-03-20 14:54:45
【问题描述】:

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

【问题讨论】:

    标签: directx screenshot gdi directx-11 dxgi


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢你的解释,capslpop。但我想知道 Screen snip 在 DXGI API 级别是如何工作的。我还发现我调试的 ScreenClippingHost.exe 是从 Win10 20H1 开始引入的,之前应该是资源管理器中的一个组件。
    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多