C++ 在OpenGL/CUDA中将顶点数据传输到GPU的最快方法

C++ 在OpenGL/CUDA中将顶点数据传输到GPU的最快方法,c++,opengl,cuda,vertex-buffer,C++,Opengl,Cuda,Vertex Buffer,我只需在每一帧上传顶点数组的特定元素(更多数千个) 或者是第一个和最后一个更改的值之间的整个区域,但是这是非常低效的,因为它有可能重新上载整个数组,无论如何会上载许多未更改的值 这个问题还包括什么是最快的方式上传顶点数据到GPU 有几种方法可以做到这一点: glBufferData() / glBufferSubData() // Standard upload to buffer glBufferData() // glBufferData with

我只需在每一帧上传顶点数组的特定元素(更多数千个) 或者是第一个和最后一个更改的值之间的整个区域,但是这是非常低效的,因为它有可能重新上载整个数组,无论如何会上载许多未更改的值

这个问题还包括什么是最快的方式上传顶点数据到GPU

有几种方法可以做到这一点:

glBufferData() / glBufferSubData()  // Standard upload to buffer
glBufferData()                      // glBufferData with double buffer
glMapBuffer()                       // Mapping video memory
cudaMemcpy()                        // CUDA memcopy from host to device vertex buffer

哪一个最快?我特别关注CUDA方式,这与标准OpenGL方法不同。它比glBufferData()或glMapBuffer()快吗?

无论使用哪种复制API,从主机向设备复制相同数据的速度应该是相似的

然而,要复制的数据块的大小非常重要。下面是一个基准测试,使用CUDA的
cudaMemcpy()
显示数据大小和复制速度之间的关系

如果您知道要调用的复制API的数量和每个副本的数据大小,您可以从上图简单地估计平均速度


当元素大小很小且元素数量很大时,通过调用copyapi数千次,仅将已更改的元素从主机复制到设备绝对不是一个好主意

是的,这将是一个简单的步骤,但我应该多次更改整个项目的实施,以对所有这些进行基准测试。很难回答。。。有时上传整个内存块可能比上传特定(仅更改)元素快得多。