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

时间:2014-10-10 20:20:34

标签: opengl opengl-3

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

以下哪项是最快的:

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

2)通过多次调用glBufferSubData将数据上传到GPU时对数据进行过滤

3)使用带有glMapBuffer的映射缓冲区将数据上传到GPU时对其进行过滤

1 个答案:

答案 0 :(得分:1)

所有这三种方法最终都会过滤CPU上的数据,然后排队命令让GPU将数据复制到视频卡。 GPU操作在很大程度上取决于OpenGL实现,但似乎最好的办法是实现整个操作集(过滤和复制)的最短时间是尽量获得尽可能多的并发性。

对我来说,这意味着你最好的方法是创建一个充当生产者的工作线程,并使主要线程(可以与OpenGL交谈的线程)成为一个消费者,这样过滤和复制就可以同时发生。这必然意味着您必须使用方法2或3,因为方法一只是序列化操作。

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