在OpenGL4.0中使用交错属性数组获得性能提升

时间:2013-02-14 12:29:41

标签: c++ performance opengl opengl-4

我使用OpenGL4.X。最近我读了this 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 个答案:

答案 0 :(得分:6)

  

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

来自Vertex specification wiki page

  

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


  

理论上性能增益有多大?

我无法回答这个问题,但我不会期待巨大的进步。唯一可靠的方法是衡量。

答案 1 :(得分:4)

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

个多个属性的顶点数可能会表现出性能上的差异。 big many 的值应通过分析确定。

答案 2 :(得分:4)

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

没有办法回答你的问题,因为任何性能提升首先取决于你是否在顶点转移性能方面存在瓶颈(即:优化的是什么)。除非你实际上推动你的显卡太硬以至于顶点着色器,片段着色器和CPU问题不会成为瓶颈,否则这无关紧要。

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

只是交错您的属性。它不需要任何费用,只需要最少的时间或精力,并且在性能方面可能具有非平凡的价值。

答案 3 :(得分:1)

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

GPU渲染一个小矩形时,必须来回寻找顶点,法线和uvmaps,因为它不能将所有这些存储在缓冲区内。

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

现在,在这种情况下,交错数组是一个很大的增益并减少了总线通信,GPU可以轻松处理交错数组,并且可以为呈现的特定顶点集提供所有数据。