首页 > 解决方案 > 将缓冲区/纹理数据从 GPU 传输到 CPU 的最快方法

问题描述

正如问题所暗示的那样,我正在尝试将一些缓冲区数据从 gpu 传输到 cpu,并且我想快速完成。

具体来说,我想在不到 1 毫秒的时间内传输一个 640x480 的浮点缓冲区。

问题 1:这可能在不到 1ms 的时间内完成吗?


不管是不是,我想知道最快的方法是什么。到目前为止,我所做的一切都是使用 FBO。以下是不同的方法及其各自的平均转移时间。所有这些都是在绑定到 FBO 并在纹理上渲染后立即运行的。由于我不是专家,我的代码中可能存在错误,或者我可能会执行不必​​要的步骤,所以请告诉我。但是,所有转移都经过检查是否成功。我将所有内容转移到 cv::Mat 对象。

1)使用 glReadPixels - < 3.1ms

   glBindTexture(GL_TEXTURE_2D,depthTexture);
   glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT,mat.data);

2)使用 glGetTexImage - <2.9ms

glBindTexture(GL_TEXTURE_2D,depthTexture);
glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, mat.data);

3) 使用带有 glGetTexImage 的 PBO - <2.3ms

glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
glBindTexture(GL_TEXTURE_2D, depthTexture);
glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
mat.data = (uchar*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); 

在我继续之前,我知道我没有充分利用 PBO,因为我立即调用 glMapBuffer,但目前 cpu 没有其他进程要做。纹理是在我拥有必要数据的那一刻绘制的,并且纹理数据对于我继续前进是必要的。尽管如此,公益组织似乎仍然更快。

这里有一些有趣的东西(至少对我来说)。这些是在调试模式下测量的。在发布模式下,它们都慢了 1 毫秒。

问题2:为什么它们在发布模式下会变慢?我可以改变这个吗?

问题3:我可以尝试其他方式进行转移吗?

第三季度的额外说明:

  1. 我在某处读到集成显卡可以更快地访问。这是一回事吗?我将如何利用这个?这是否连接到 GL_INTEL_map_texture?

  2. 我几乎不知道 CUDA 是什么,但似乎有一种方法可以使用它更快地进行传输。这是真的?

  3. 读取深度缓冲区而不是纹理会更快吗?

标签: c++opengl

解决方案


推荐阅读