【问题标题】:Performance gain using interleaved attribute arrays in OpenGL4.0在 OpenGL4.0 中使用交错属性数组获得性能提升
【发布时间】:2013-01-30 06:14:29
【问题描述】:

我使用 OpenGL4.X。最近我阅读了thisApple OpenGLES2 文档,其中指出使用交错属性数组可以提高 IOS 移动设备的性能,并且是推荐的方式(而不是使用属性块)。

对于那些不明白我的意思的人,这里是一个例子:

单个属性数组中的属性块:

 float vertices[]{
 //Triangle vertices:

  v0x , v0y , v0z ,
  v1x , v1y , v1z ,
  v2x , v2y , v2z ,

  //Triangle UVs:

  uv0s , uv0t ,
  uv1s , uv1t ,
  uv2s , uv2t ,

  //Triangle Normals:
  n0x , n0y , n0z ,
  n1x , n1y , n1z ,
  n2x , n2y , n2z 

}

交错属性数组:

 float vertices[]{


  v0x , v0y , v0z ,
  uv0s , uv0t ,          ////vertex 1 attributes
  n0x , n0y , n0z ,

  v1x , v1y , v1z ,
  uv1s , uv1t ,         ///vertex 2 attributes
  n1x , n1y , n1z ,

  v2x , v2y , v2z ,
  uv2s , uv2t ,         ///vertex 3 attributes
  n2x , n2y , n2z 

}

所以我的问题是:在桌面 GPU 上运行的 OpenGL 也是如此吗?如果是,那么理论上性能增益可以有多大?

【问题讨论】:

标签: c++ performance opengl opengl-4


【解决方案1】:

交错属性数组的好处是内存局部性。这意味着所有必要的顶点数据都位于彼此相邻的位置,并且与位于多个缓冲区中的数据相比,可以更有效地获取。

拥有大量个具有许多属性的顶点可能会表现出性能上的差异。 bigmany 的值应该通过 profiling 来确定。

【讨论】:

  • 这也是我读到的,但它在现实中增加了多少性能?这就是问题所在。
  • @MichaelIV “在现实中”? - 取决于一百万个不同的东西。什么硬件?什么司机?有多少属性?有多少个顶点?您是否必须动态更改某些属性?如果是,如何权衡更新中的惩罚与渲染中的惩罚?你还在管道中做什么,它甚至是带宽限制吗? - 真的,你想听数字还是什么?
  • 我认为你可以把像这样广泛的东西作为答案:)
【解决方案2】:

对于在桌面 GPU 上运行的 OpenGL 也是如此吗?

来自Vertex specification wiki page

作为一般规则,您应该尽可能使用交错属性。显然,如果您需要更改某些属性而不是其他属性,那么将更改的属性与不更改的属性交错放置不是一个好主意。


理论上性能提升有多大?

我无法真正回答这个问题,但我预计不会有很大的改进。唯一可靠的方法是测量。

【讨论】:

    【解决方案3】:

    为了使任何优化成为性能提升,它必须首先优化一些性能瓶颈。除非它目前是一个瓶颈,否则对它采取任何措施都不一定会提高性能。

    没有办法回答您的问题,因为任何性能提升首先取决于您是否在顶点传输性能上遇到瓶颈(即:优化了什么)。除非你真的非常努力地推动你的显卡,以至于你的顶点着色器、片段着色器和 CPU 问题不会成为瓶颈,否则这无关紧要。

    而且没有办法知道它的增益有多大,因为不同的硬件会有不同的响应。根据瓶颈的紧张程度,不同的情况会做出不同的反应。

    只需交错你的属性。它不花钱,只需要最少的时间或精力,并且在性能方面可能具有不平凡的价值。

    【讨论】:

    • 是的,我明白了,但事实上您仍然建议默认使用交错,这可能意味着在大多数情况下这是最好的选择。
    【解决方案4】:

    我可能错了,但我的看法是 GPU 在渲染三角形的顶点时需要数据(顶点、法线和 uv 贴图),并且如果顶点、法线和 uv 贴图的缓冲区对于对象,例如一个大球体(使用 glvertex 而非 glsphere 渲染)...

    GPU 必须在渲染一个小矩形时来回处理顶点、法线和 uvmap,因为它无法将所有这些都存储在自身内部的缓冲区中。

    总线上的通信通常比处理器速度慢。

    现在,在这种情况下,交错数组是一个很大的增益,减少了总线通信,GPU 可以轻松处理交错数组,并将所有数据用于渲染一组特定的顶点。

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      相关资源
      最近更新 更多