C++ 如何加快屏幕外OpenGL点云扭曲渲染代码的速度?
我正在研究一种视觉里程计算法,它可以跟踪摄像机在图像之间的移动。该算法的一个组成部分是能够生成参考图像的增量密集扭曲图像,其中每个像素具有相应的深度(因此可以将其视为宽度x高度维度的点云) 在过去,我没有太多使用OpenGL的经验,但通过一些教程,我成功地设置了一个屏幕外渲染管道,以接收转换矩阵并从新的角度渲染点云。我使用VBOs在GPU中加载数据,renderbuffers进行渲染,glReadPixels()读取CPU内存 在我的Nvidia卡上,我可以以每扭曲~1毫秒的速度渲染。这是我渲染数据的最快速度(640x480个3D点)?这一步被证明是我的算法的一个主要瓶颈,所以我非常感谢任何性能提示 (我认为一种优化可能只在灰度级渲染,因为我并不真正关心颜色,但似乎OpenGL内部还是使用颜色) 我当前的实现在 , 以及C++ 如何加快屏幕外OpenGL点云扭曲渲染代码的速度?,c++,opengl,transformation,C++,Opengl,Transformation,我正在研究一种视觉里程计算法,它可以跟踪摄像机在图像之间的移动。该算法的一个组成部分是能够生成参考图像的增量密集扭曲图像,其中每个像素具有相应的深度(因此可以将其视为宽度x高度维度的点云) 在过去,我没有太多使用OpenGL的经验,但通过一些教程,我成功地设置了一个屏幕外渲染管道,以接收转换矩阵并从新的角度渲染点云。我使用VBOs在GPU中加载数据,renderbuffers进行渲染,glReadPixels()读取CPU内存 在我的Nvidia卡上,我可以以每扭曲~1毫秒的速度渲染。这是我渲染
谢谢 是否不是渲染而是帧缓冲区的复制花费了您最多?也许您可以创建一个帧缓冲区池,以便在复制已完成的帧缓冲区的同时继续渲染?问题是,由于我的算法在扭曲上是连续的,因此我必须等待扭曲图像的输出,然后才能获得要使用的新变换。我确实理解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)?您是否尝试过复制浮点而不是字节(要传输的数据更多,但处理更少?)