Performance 使用大量小型VBO的性能

Performance 使用大量小型VBO的性能,performance,opengl,graphics,Performance,Opengl,Graphics,我想知道OpenGL VBO是否只用于大型几何体阵列,或者即使用于小型阵列也有意义。我有一些代码可以定位各种几何体相对于其他几何体的位置,但是一些“叶子”几何体对象非常小,有10x10个四球体等等(每个有200个三角形)。我可能有很多这样的小叶子物体。我希望能够为这些小叶子对象中的每一个创建一个不同的变换矩阵。看来我有两个选择: 对每个叶对象使用单独的VBO。我最终可能会拥有大量的VBO 我可以在一个VBO中存储多个对象的数据,并在更改给定叶对象的数据时自己应用适当的变换。这似乎很奇怪,因为Op

我想知道OpenGL VBO是否只用于大型几何体阵列,或者即使用于小型阵列也有意义。我有一些代码可以定位各种几何体相对于其他几何体的位置,但是一些“叶子”几何体对象非常小,有10x10个四球体等等(每个有200个三角形)。我可能有很多这样的小叶子物体。我希望能够为这些小叶子对象中的每一个创建一个不同的变换矩阵。看来我有两个选择:

  • 对每个叶对象使用单独的VBO。我最终可能会拥有大量的VBO

  • 我可以在一个VBO中存储多个对象的数据,并在更改给定叶对象的数据时自己应用适当的变换。这似乎很奇怪,因为OpenGL的一部分要点是在硬件中高效地执行大量矩阵运算。我会在软件方面做一些OpenGL设计在硬件方面做得很好的事情


  • 拥有大量VBO是低效的,还是我应该继续选择选项1?有没有更好的方法来处理有很多小物体的情况?我应该改为使用顶点数组或类似的东西吗?

    一些好的信息位于:

    我认为每一个网格200个三角形的数量不是很小,而且可能每个网格使用VBO的性能不会降低太多。不幸的是,这取决于硬件规格

    一个巨大的缓冲区不会带来巨大的性能差异。。。我认为最好的选择是每个VBO存储几个(但不是全部)对象

    renderin使用一个缓冲区: 这没问题。。。您只需绑定一个缓冲区,然后就可以使用具有不同参数的gldrawArray。例如,如果一个网格由100个顶点组成,并且在缓冲区中有10个网格可以使用

    glDrawArrays(triangles, 0, 100);
    glDrawArrays(triangles, 100, 100);
    glDrawArrays(triangles, ..., 100);
    glDrawArrays(triangles, 900, 100);
    
    通过这种方式,您可以最大限度地减少缓冲区的变化,并且仍然能够非常有效地渲染缓冲区

    那些“小”物体是一样的吗?它们是否具有相同的几何体但不同的变换/材质?因为可能值得使用“实例化”?

    如果您的数据是静态的,并且由一个对象组成,那么最好的解决方案是使用一个VBO只对一个网格进行实例化。否则,一般规则是,除了在主绘制循环中渲染之外,您希望避免执行任何操作

    • 如果在初始化后不需要添加或删除对象(或变形任何对象),则永久绑定单个缓冲区并更改跨距/偏移值以渲染不同的对象可能更有效

    • 如果只有一组将保持静态的基本几何体,请使用单个VBO,并对可以添加/删除/变形的几何体使用单独的VBO

    • 如果可以随意放入对象或删除对象,则每个对象都应该有自己的VBO,以使内存管理更加简单


    即使我的几何体保持静态,我如何处理不同的变换可以应用于不同的叶几何体对象的事实?或者这不是静态的?将所有内容放在一个缓冲区中,然后使用重复的
    glDrawRangeElements
    调用是否比创建几何体对象数量相同的缓冲区更有效?在这种情况下,我只需要为每个网格(不是每个对象,每个网格)创建单独的VBO,并分别处理它们的变换。如果您发现这是一个性能问题,那么我会进行优化。以下是一些信息:,但基本上这是一种优化的方法,可以多次渲染相同的对象(但使用不同的变换和材质)