在使用VAO时,VBO中的交错是否会加快性能

Mer*_*rni 14 opengl vertex-buffer arraybuffer

当您使用交错的VBO而不是使用多个VBO时,通常会加快速度.这在使用VAO时也有效吗?

因为对于位置有一个VBO,对于法线等有一个VBO更方便.你可以在多个VAO中使用一个VBO.

Sam*_*Sam 18

VAOs

  • 为了共享更大的数据集,包含单个顶点(attrib)数组的专用缓冲区肯定是一种方法,而一个仍然可以在另一个缓冲区中交错特定数组并使用VAO组合它们.

  • VAO处理所有这些缓冲区和顶点(属性)数组状态的绑定,例如数组缓冲区绑定和带有(缓冲区)指针和启用/禁用标志的attrib条目.除了方便之外,它还可以快速完成这项工作,更不用说简单的API调用,它可以立即更改所有状态,而无需繁琐的启用和禁用attrib数组.它基本上做了,我们以前必须手动做什么.但是,通过我自己的类似VAO的实现,我无法衡量任何性能损失,即使在进行大量绑定时也是如此.从我的角度来看,主要优点是它的便利性.

因此,VAO不会根据glDraw*决定绘制性能,但它会对状态更改的开销产生影响.

交错数据格式......

  • ...导致较少的GPU缓存压力,因为单个顶点的顶点坐标和属性并未遍布内存.它们连续适应几个缓存行,而分散的属性可能导致更多的缓存更新,从而导致驱逐.由于远程内存位置,最坏的情况可能是每个高速缓存行一个(属性)元素,而顶点以非确定性/非连续方式拉取,可能没有预测和预取开始.GPU非常在这个问题上类似于CPU.

  • ...对于各种外部格式也非常有用,这些格式满足不推荐使用的交错格式,其中兼容数据源的数据集可以直接读入映射的GPU内存.出于这些原因,我最终使用当前的API重新实现了这些交错格式.

  • ...应该像简单的数组一样友好对齐.混合具有不同大小/对齐要求的各种数据类型可能需要填充为GPU和CPU友好.这是我所知道的唯一不利因素,从更难实施来看.

  • ...不要阻止您指向其中的单个attrib数组进行共享.

交错很可能会提高拉丝性能.

结论:

根据我的经验,最好为顶点数据源和"编译"VAO设计干净的界面,可以适当地封装VAO工厂.然后可以更改此工厂以从数据源初始化交错,单独或混合的顶点缓冲区布局,而不会破坏任何内容.这对于分析特别有用.

在所有这些喋喋不休之后,我的建议很简单:在优化之前进行适当且充分抽象的设计.

  • 很高兴看到一个SO答案说"让你的架构正确,事情最终会在理想的情况下发挥作用".我专注于一般应用程序领域的架构和API,这个答案让我看到了我的OpenGL代码需要解决的问题.谢谢! (3认同)