2016-03-02 179 views
0

我正在绘制简单的3D形状,并且从长远来看,我想知道只使用1个缓冲区来存储顶点的所有数据会更好吗?多个缓冲区vs单个缓冲区?

现在我有一个顶点[]和颜色[],我推他们通过他们自己的单独缓冲区,但如果我使用步幅和偏移量,我可以将它们加入到一个数组中,但这会变得更加困难和困难管理。传统的做法是什么?它感觉更清洁并且有组织地为每个数据片段提供单独的缓冲区,但是我会认为它效率较低。效率增加是否值得把它全部放入1个数组中?

+1

它会变得更混乱或难以管理? –

+1

选中此项: [VBO中的交错加速了使用VAO时的性能](http://stackoverflow.com/questions/18853713/does-interleaving-in-vbos-speed-up-performance-when-using-vaos) –

回答

3

对此的答案依赖于高度使用。

如果您的所有顶点属性都非常易变或高度静态,您可能会受益于interleaving并将它们保持在一起,如评论中所述。

但是,如果一个属性比另一个属性更不稳定,那么分离数据可以产生更好的性能。例如,如果你有一个网格,你经常改变顶点的位置,但从来没有纹理坐标,你可能会从保持它们的分离中受益:你只需要重新上传位置到视频卡,而不是整套属性。一个例子可能是一个CPU驱动的布料模拟。

它也是硬件和执行相关的。交错无处不在,但我从来没有听说它有负面影响。如果你可以使用它,你可能应该。

但是,由于如果您分割属性时无法正确交错,您基本上会比较两个未知的性能影响。交错对您的目标硬件/驱动程序有帮助吗?您的数据是否会因分裂而受益?第一个没有真正的答案。第二个是你和你的数据之间。

就个人而言,我会建议只使用交错的单个顶点属性块,除非您有高度专业化的需求。它削减了复杂性,而不是需要在相同的后端混合可能不同的系统。

另一方面,就C++中的内存寻址而言,设置交错是一项相当复杂的任务。如果你不是从头开始设计整个图形引擎,我真的怀疑它是值得为你付出的努力。但是,这又取决于你和你的应用程序。

理论上,只是将您要上传到视频卡的数据分组在一起,不管应该产生什么影响。这可能是略微由于减少了调用的数量而将所有属性组合在一起更有效,但这又将取决于驱动程序。

不幸的是,我想简单回答你的问题归结为:“这取决于”“没有人真正知道”