您可能知道尝试以 GDI 方式捕获 DirectX 全屏应用程序(使用BitBlt()
)给出一个black截屏。
我的问题很简单,但我找不到任何答案:why?我是说技术上,为什么截图是黑色的?
我正在阅读 DirectX 教程:http://www.directxtutorial.com/Lesson.aspx?lessonid=9-4-1。上面写着:
[...] 函数 BeginScene() [...] 执行称为锁定的操作,其中视频 RAM 中的缓冲区被“锁定”,从而授予您对此内存的独占访问权限。
是这个原因吗? VRAM 被锁定,因此 GDI 无法访问它,并且屏幕截图为黑色?
还是还有其他原因?就像 DirectX 直接与显卡“对话”而 GDI 却听不懂?
谢谢。
原因很简单:性能。
这个想法是在 GPU 上尽可能多地渲染与 CPU 不同步的场景。你使用CPU将渲染缓冲区发送到GPU(顶点、索引、着色器等),这总体来说非常便宜,因为它们很小,然后你可以做任何你想做的事情,物理,多人同步等。GPU可以处理数据并自行渲染。
如果你需要在窗口上绘制场景,你必须中断GPU,请求渲染缓冲区字节(LockRect
),请求窗口的图形对象(对 GPU 的干扰更大),渲染它并释放每个锁。您只是失去了在 GPU 上渲染与 CPU 不同步所获得的任何增益。更糟糕的是,当您想到所有不同的 CPU 核心因为忙于“渲染”(更像是等待缓冲区传输)而处于空闲状态时。
因此,图形驱动程序所做的就是用幻彩绘制渲染区域,并告诉 GPU 场景的位置,GPU 负责根据幻彩像素(有点像多像素)将场景覆盖在显示的屏幕上。当第一个纹理具有特定颜色时,传递从第二个纹理获取的像素着色器x
,y
,但没那么慢)。您的渲染完全不同步,但是当您向操作系统询问其视频内存时,您会得到场景所在的神奇颜色,因为这就是它实际使用的颜色。
参考:http://en.wikipedia.org/wiki/Hardware_overlay
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)