gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:04 27 4
gpt4 key购买 nike

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

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

我正在阅读 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 负责根据魔法颜色像素(有点像当第一个纹理具有 x,y 的特定颜色时,从第二个纹理获取的多 channel 像素着色器,但不是那么慢)。你得到完全不同步的渲染,但是当你向操作系统询问它的视频内存时,你会得到场景所在的神奇颜色,因为那是它实际使用的颜色。

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com