12

我使用 OpenGL4.X。最近我阅读了这个Apple 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 也是如此吗?如果是,那么理论上性能增益可以有多大?

4

4 回答 4

8

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

顶点规范维基页面

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


理论上性能提升有多大?

我不能真正回答这个问题,但我不希望有巨大的进步。唯一确定的方法是测量。

于 2013-02-14T12:45:20.577 回答
6

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

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

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

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

于 2013-02-14T17:50:30.107 回答
4

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

拥有大量具有许多属性的顶点可能会表现出性能上的差异。bigmany的价值观应该通过剖析来建立。

于 2013-02-14T12:39:04.933 回答
1

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

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

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

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

于 2016-05-12T18:16:24.860 回答