opengl - 使用 VAO 时,VBO 中的交错是否会提高性能

标签 opengl vertex-buffer arraybuffer

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

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

最佳答案

VAO

  • 为了共享更大的数据集,包含单个顶点(属性)数组的专用缓冲区肯定是一种方法,而人们仍然可以在另一个缓冲区中交错特定数组并使用 VAO 组合它们。
  • VAO 处理所有这些缓冲区和顶点(属性)数组状态的绑定(bind),例如数组缓冲区绑定(bind)和带有(缓冲区)指针和启用/禁用标志的属性条目。除了方便之外,它还旨在快速完成这项工作,更不用说简单的 API 调用了,它可以一次更改所有状态,而无需繁琐的启用和禁用属性数组。它基本上可以,我们之前必须手动执行的操作。但是,使用我自己的类似 VAO 的实现,我无法测量任何性能损失,即使在进行大量绑定(bind)时也是如此。从我的角度来看,主要优点是它的方便。

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

    交错数据格式...
  • ...减少 GPU 缓存压力,因为单个顶点的顶点坐标和属性不会分散在内存中。它们连续地适合几个缓存行,而分散的属性可能会导致更多的缓存更新并因此被驱逐。最坏的情况可能是每个缓存行一次一个(属性)元素,因为内存位置很远,而顶点以非确定性/非连续方式被拉取,可能没有预测和预取作用。GPU 非常在这件事上类似于 CPU。
  • ...对于满足不推荐使用的 interleaved formats 的各种外部格式也非常有用,其中兼容数据源的数据集可以直接读入映射的 GPU 内存。正是出于这些原因,我最终用当前的 API 重新实现了这些交错格式。
  • ...应该像简单的数组一样布局对齐友好。混合具有不同大小/对齐要求的各种数据类型可能需要填充以对 GPU 和 CPU 友好。这是我所知道的唯一缺点,除了更困难的实现。
  • ...不要阻止您指向其中的单个属性数组进行共享。

  • 交错很可能会提高绘制性能。

    结论:

    根据我的经验,最好为顶点数据源和“编译”的 VAO 设计干净的接口(interface),这样可以适本地封装 VAO 工厂。然后可以更改此工厂以从数据源初始化交错、分离或混合的顶点缓冲区布局,而不会破坏任何内容。这对于分析特别有用。

    经过这么多唠叨,我的建议很简单:在优化之前和优化之前进行适当且充分抽象的设计。

    关于opengl - 使用 VAO 时,VBO 中的交错是否会提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18853713/

    相关文章:

    c++ - 无法使用 freetype2 为 opengl 正确加载 "glyp"

    c++ - 为什么我无法在 Visual Studio 之外运行 OpenGL 程序?

    c - OpenGL顶点数组初始化

    ios - 使用 GL_POINTS 通过 OpenGL 改变线宽 (iOS)

    c++ - OpenGL:顶点索引缓冲区的问题

    javascript - 当忽略每个字节的前导位时,是否有一种简单的方法可以从一组字节中生成一个数字?

    javascript - 如何将缓冲区数组转换为十六进制?

    macos - 如何从屏幕上读取一个像素?

    javascript - XMLHTTP Post 不起作用

    linux - 如何在 2 个进程(linux)之间共享 OpenGL 上下文/纹理