【发布时间】:2014-07-13 03:35:56
【问题描述】:
我正在尝试捕获屏幕截图并对它们进行一些操作。 我的目标是尽可能少地使用 CPU 并利用 GPU,所以我想使用 CUDA 来进行图像处理。
到目前为止,我正在使用 Windows API(StretchBlt 和 GetDIBits)将帧缓冲区复制到 RAM,并使用 cudaMemcpy 将其复制到 VRAM。
这些内存副本使用 CPU,当每秒复制许多帧时,它会占用大量 CPU。 这就是为什么我想将帧缓冲区直接复制到 VRAM 以供 CUDA 使用。
我发现了一种使用 OpenGL PBO 的技术,如下所述:http://gravisma.zcu.cz/GraVisMa-2010/Papers/Poster/F13-full.pdf,听起来它可能就是这样做的方法。
有类似的例子吗?
编辑:
我还发现了这个:http://www.songho.ca/opengl/gl_pbo.html。 它说:
“PBO 的主要优点是快速的像素数据传输到和从 显卡通过 DMA(直接内存访问)而不涉及 CPU 循环。而且,PBO 的另一个优点是异步 DMA 传输。”
所以看起来 PBO 是正确的方向,但我真的不确定如何去做。
能否用源代码举例说明?
平台:Windows XP(仅限 win32)
【问题讨论】:
-
您是要截取整个桌面还是截取 OpenGL 应用程序?
-
@BrunoFerreira,整个桌面。
-
我可能错了,但你不能使用 OpenGL PBO,因为 Windows 不使用 OpenGL 进行渲染,所以没有关于每个像素包含什么的信息。您必须使用您正在使用的内容,然后将位图数据导入 PBO。
-
在我提供的链接上,他们说这是可能的。我正在寻找一个样品来确认......
-
两件事:将可见帧缓冲区(即前端缓冲区)读入 PBO仅如果没有 DWM 处于活动状态。否则,您必须使用 GDI。此外,作为一个挑剔的人,使用 PBO 的主要原因不是 PBO 传输速度更快,而是异步传输。