c++ - 将缓冲区/纹理数据从 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:我可以尝试其他方式进行转移吗?
第三季度的额外说明:
我在某处读到集成显卡可以更快地访问。这是一回事吗?我将如何利用这个?这是否连接到 GL_INTEL_map_texture?
我几乎不知道 CUDA 是什么,但似乎有一种方法可以使用它更快地进行传输。这是真的?
读取深度缓冲区而不是纹理会更快吗?
解决方案
推荐阅读
- mysql - 如何获得 MariaDB 的当前值?
- assembly - 组装测验 - 阶段 6
- javascript - 无法在 html 中呈现 JSON - node.js
- isabelle - 什么样的函数保留了闭包的性质?
- javascript - JS - 将字符串值转换为数字、布尔值或字符串的最佳方法?
- c - Cygwin makefile 编译找不到 -lregex
- c# - 未创建使用 smtp 客户端线程的 gmail 重播
- javascript - 如何在不使用 JavaScript 中的减号运算符的情况下减去两个数字?或使用 For 循环
- android - 如何在 kodein 中调用的第二时间重新绑定模块?
- javascript - 当我们编写 for..of 循环时,它如何在内部调用 symbol.iterator