多缓冲区与单缓冲区?

时间:2016-03-02 19:37:15

标签: opengl

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

现在我有一个顶点[]和颜色[]并且我将它们推送到它们自己的单独缓冲区,但是如果我使用了步幅和偏移量,我可以将它们连接到一个数组中,但这将变得更加混乱和难以管理。这样做的传统方式是什么?为每个数据分配缓冲区感觉更清晰,更有条理,但我认为效率较低。提高效率值得将它全部放入一个阵列吗?

1 个答案:

答案 0 :(得分:4)

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

如果您的所有顶点属性都是高度不稳定或高度静态的,那么您可能会从interleaving中受益并将它们保持在一起,如评论中所述。

但是,如果一个属性比其他属性更具波动性,则分离数据可以产生更好的性能。例如,如果你有一个网格,你经常改变顶点位置,但从不改变纹理坐标,你可能会因为保持它们分开而受益:你只需要将位置重新上传到视频卡,而不是整套属性。这方面的一个例子可能是CPU驱动的布料模拟。

它还依赖于硬件和实现。交错在任何地方都没有用,但我从来没有听说它会产生负面影响。如果你可以使用它,你可能应该。

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

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

另一方面,就C ++中的内存寻址而言,设置交错是一项相当复杂的任务。如果你不是从零开始设计一个完整的图形引擎,我真的怀疑它值得你努力。但同样,这取决于您和您的申请。

理论上,只是将您要上传到视频卡的数据组合在一起,无论其影响不大。由于减少了调用次数,将所有属性组合在一起可能略微更有效率,但这又会依赖于驱动程序。

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