Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何加快屏幕外OpenGL点云扭曲渲染代码的速度?_C++_Opengl_Transformation - Fatal编程技术网

C++ 如何加快屏幕外OpenGL点云扭曲渲染代码的速度?

C++ 如何加快屏幕外OpenGL点云扭曲渲染代码的速度?,c++,opengl,transformation,C++,Opengl,Transformation,我正在研究一种视觉里程计算法,它可以跟踪摄像机在图像之间的移动。该算法的一个组成部分是能够生成参考图像的增量密集扭曲图像,其中每个像素具有相应的深度(因此可以将其视为宽度x高度维度的点云) 在过去,我没有太多使用OpenGL的经验,但通过一些教程,我成功地设置了一个屏幕外渲染管道,以接收转换矩阵并从新的角度渲染点云。我使用VBOs在GPU中加载数据,renderbuffers进行渲染,glReadPixels()读取CPU内存 在我的Nvidia卡上,我可以以每扭曲~1毫秒的速度渲染。这是我渲染

我正在研究一种视觉里程计算法,它可以跟踪摄像机在图像之间的移动。该算法的一个组成部分是能够生成参考图像的增量密集扭曲图像,其中每个像素具有相应的深度(因此可以将其视为宽度x高度维度的点云)

在过去,我没有太多使用OpenGL的经验,但通过一些教程,我成功地设置了一个屏幕外渲染管道,以接收转换矩阵并从新的角度渲染点云。我使用VBOs在GPU中加载数据,renderbuffers进行渲染,glReadPixels()读取CPU内存

在我的Nvidia卡上,我可以以每扭曲~1毫秒的速度渲染。这是我渲染数据的最快速度(640x480个3D点)?这一步被证明是我的算法的一个主要瓶颈,所以我非常感谢任何性能提示

(我认为一种优化可能只在灰度级渲染,因为我并不真正关心颜色,但似乎OpenGL内部还是使用颜色)

我当前的实现在 , 以及


谢谢

是否不是渲染而是帧缓冲区的复制花费了您最多?也许您可以创建一个帧缓冲区池,以便在复制已完成的帧缓冲区的同时继续渲染?问题是,由于我的算法在扭曲上是连续的,因此我必须等待扭曲图像的输出,然后才能获得要使用的新变换。我确实理解CPU-GPU memcpy需要时间,但我觉得应该比需要的时间快。另外,我在Jetson TX1上进行了试验,其中GPU和CPU共享内存,需要3毫秒,因此我认为还有其他因素会影响运行时间。此外,我还尝试了第一步分析,但所有的符号看起来都像GL驱动程序调用,我不太擅长解析这些符号。我可以看到,您正在为每个帧分配和释放内存。如果这是你开销的一大部分,我不会感到惊讶。我建议尝试在不复制像素的情况下对其进行分析,然后不进行分配和取消分配。
display
方法是否可以接收指向可重用缓冲区的指针?算法的以下部分是高度并行的吗?也许将其转换为GPU实现将是有益的,因为您可以避免不必要的数据移动?@patrik-h好的,所以如果我不
glReadPixels()
,它会非常快(7 us),但这并不是重点。调用
display
方法之前分配图像缓冲区不会影响定时性能。我真的不想把所有东西都移动到GPU上,因为我的算法下游还有其他复杂的地方(而且我希望最终能够在CPU上运行所有东西)。我希望使用Jetson之类的东西可以帮助我避免内存开销。除了-o3和-marchwell之外,我还应该指定哪些特定的编译标志,现在您知道复制操作是需要优化的。您是否尝试过创建GL\u READ\u帧缓冲区而不是GL\u帧缓冲区?由于您只对单个频道感兴趣,您是否尝试过复制单个频道(例如使用GL_RED)?您是否尝试过复制浮点而不是字节(要传输的数据更多,但处理更少?)