多个缓冲区与单个缓冲区?

use*_*885 4 opengl

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

现在我有顶点数据数组(位置和颜色,每个顶点),我将它们推送到它们自己单独的缓冲区。

但是如果我使用strideand offset,我可以将它们加入一个数组,但这会变得更加混乱和难以管理。

这样做的“传统”方式是什么?

为每条数据设置单独的缓冲区感觉更干净,更有条理,但我认为它的效率较低。

效率提升是否值得将其全部放在一个缓冲区中?

小智 7

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

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

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

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

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

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

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

但是,理论上,仅仅将您要上传到视频卡的数据分组在一起应该没有什么影响。由于减少了调用次数,将所有属性组合在一起可能会稍微高效一些,但这又将高度依赖于驱动程序。

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