Opengl 将数据加载到缓冲区对象的最快方法?

Opengl 将数据加载到缓冲区对象的最快方法?,opengl,opengl-3,Opengl,Opengl 3,我正在将静态数据从CPU内存加载到OpenGL缓冲区对象。 数据需要重新格式化(即过滤) 以下哪项最快: 1) 复制并过滤CPU上的数据。然后调用glBufferData一次 2) 通过多次调用glBufferSubData来过滤上传到GPU的数据 3) 当数据上传到GPU时,使用带有glMapBuffer的映射缓冲区对其进行过滤所有这三种方法最终都会在CPU上对数据进行过滤,然后对命令进行排队,以便GPU将数据复制到视频卡。GPU操作在很大程度上依赖于OpenGL实现,但要实现整个操作集(过滤

我正在将静态数据从CPU内存加载到OpenGL缓冲区对象。 数据需要重新格式化(即过滤)

以下哪项最快:

1) 复制并过滤CPU上的数据。然后调用glBufferData一次

2) 通过多次调用glBufferSubData来过滤上传到GPU的数据


3) 当数据上传到GPU时,使用带有glMapBuffer的映射缓冲区对其进行过滤所有这三种方法最终都会在CPU上对数据进行过滤,然后对命令进行排队,以便GPU将数据复制到视频卡。GPU操作在很大程度上依赖于OpenGL实现,但要实现整个操作集(过滤和复制)的最短时间,似乎最好的办法是尽量获得尽可能多的并发性

对我来说,这意味着您最好的方法是创建一个作为生产者的工作线程,并使主线程(可以与OpenGL对话的线程)成为使用者,以便可以同时进行过滤和复制。这必然意味着您必须使用方法2或3,因为方法1将简单地序列化操作


因此,编写一个线程,迭代要过滤的数据,并将后处理的数据推送到共享队列中。在主线程上,创建一个循环,该循环获取队列中当前的数据并将其复制到OpenGL。您需要一个信号机制来告诉主线程何时所有数据都已被推入缓冲区,以便它知道在该点上,如果缓冲区为空,它可以退出循环

有好几次,
glBufferData
对我来说是最快的,但是其他人说,
glMapBuffer
在他们的机器上是最快的。没办法确定。你能澄清一下吗?你是说1)对你来说是最快的吗?好几次?是的,但是其他人却声称相反,这又有什么不同呢?OpenGL实现跨越多个体系结构和操作系统。他们之间的最佳做法肯定会有所不同。这是一个很好的建议,但它回答了一个不同的问题。在这里,我试图比较这三个API调用(在单线程的情况下,或者比较2)和多线程(如果需要)中的3)。有什么建议吗?例如,如果我坚持使用单线程,并且1)和2)是等效的,那么2)显然更好,因为它不会进行额外的复制。使用您描述的多线程方法,我认为如果使用
glMapBuffer
,可以避免额外的共享队列。如果主线程映射缓冲区,则辅助线程可以写入映射的缓冲区内存。当然,您仍然需要线程同步,以便主线程知道何时写入了所有数据,从而可以取消缓冲区的映射,并开始使用它进行渲染。