c++ - 为什么 DirectX 全屏应用程序会出现黑色屏幕截图?

标签 c++ directx hook screenshot fullscreen

您可能知道尝试以 GDI 方式捕获 DirectX 全屏应用程序(使用 BitBlt())会得到黑色屏幕截图。

我的问题相当简单,但我找不到任何答案:为什么?我的意思是技术上,为什么它会给出黑色屏幕截图?

我正在此处阅读 DirectX 教程:http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-1 。上面写着:

[...] the function BeginScene() [...] does something called locking, where the buffer in the video RAM is 'locked', granting you exclusive access to this memory.

是这个原因吗? VRAM 被锁定,因此 GDI 无法访问它,并且屏幕截图为黑色? 还是还有其他原因?就像 DirectX 直接与显卡“对话”而 GDI 无法理解一样?

谢谢。

最佳答案

原因很简单:性能。

这个想法是在 GPU 上尽可能多地渲染与 CPU 不同步的场景。你使用 CPU 将渲染缓冲区发送到 GPU(顶点、索引、着色器等),这总体来说非常便宜,因为它们很小,然后你可以做任何你想做的事情,物理、多人同步等。GPU 可以处理数据并自行渲染。

如果需要在窗口上绘制场景,则必须中断GPU,请求渲染缓冲区字节(LockRect),请求窗口的图形对象(干扰较多)与 GPU),渲染它并释放每个锁。您只是失去了在 GPU 上渲染与 CPU 不同步所获得的任何增益。更糟糕的是,当您想到所有不同的 CPU 核心因为忙于“渲染”(更像是等待缓冲区传输)而处于空闲状态时。

所以图形驱动程序所做的就是用幻彩绘制渲染区域并告诉 GPU 场景的位置,GPU 负责根据幻彩像素将场景覆盖在显示的屏幕上(有点像多 channel 像素着色器,当第一个纹理具有 xy 的特定颜色时从第二个纹理获取,但速度没那么慢)。您的渲染完全不同步,但是当您向操作系统询问其视频内存时,您会得到场景所在的神奇颜色,因为这就是它实际使用的颜色。

引用:http://en.wikipedia.org/wiki/Hardware_overlay

关于c++ - 为什么 DirectX 全屏应用程序会出现黑色屏幕截图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21535001/

相关文章:

c++ - 使用 C++ 创建 rw 管道的最佳方法是什么?

c++ - 按值返回堆栈中的对象

c++ - DXGI AcquireNextFrame 仅在 20ms (50fps) 后才接收下一帧,是否可以加速到 10ms?

opengl - 模型 View 投影矩阵的目的

python - Windows 与 Python Hook

c++ - 未检测到发射信号

android - Qt Quick Controls 2 启动画面

c++ - 将项目移动到 Visual Studio 2012

c - C 中的函数操作码

ip - Loopback 从操作钩子(Hook)中获取 IP 地址