【问题标题】:Reading the Visible Frame Buffer to a Pixel Buffer Object将可见帧缓冲区读取到像素缓冲区对象
【发布时间】: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 传输速度更快,而是异步传输。

标签: c++ opengl cuda gpu


【解决方案1】:

如果您需要在 CUDA 中处理屏幕截图,为什么不使用 OpenGL 互操作?这使您可以将纹理/缓冲区作为图像读取。这样一来,所有数据都保留在 GPU 上,而 CPU 永远不会被使用。

稍后,您可以将纹理映射到 CPU 内存/固定内存并将其保存到文件中(因为您需要屏幕截图)。传输将在 DMA 和 CPU 不涉及的情况下发生。

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多