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


我使用OpenGL4.X。最近我读了 这个 Apple OpenGLES2 doc,其中声明使用交错属性数组可提高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也是如此吗?如果是,那么理论上性能增益有多大?


7584
2018-02-14 12:29


起源

可能重复 交错顶点提交如何帮助提高性能? - legends2k


答案:


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

顶点规范维基页面 :

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


从理论上讲,性能增益有多大?

我无法回答这个问题,但我不希望有太大的进步。唯一可靠的方法是衡量。


6
2018-02-14 12:45



Wiki ref的+1。我总是忘记它的存在! - Michael IV


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

 顶点数 许多 属性可能表现出性能上的差异。的价值观  和 许多 应该通过剖析建立。


4
2018-02-14 12:39



这也是我读到的,但它在实际中增加了多少性能?就是那个问题。 - Michael IV
@MichaelIV “事实上”? - 取决于一百万种不同的东西。什么硬件?什么司机?有多少属性?有多少个顶点?您是否必须动态更改某些属性?如果是的话,如何在渲染中更新处罚时加重处罚?您还在管道中做了什么,甚至是带宽限制? - 真的,你想听到数字还是什么? - Christian Rau
我想你可以把这样广泛的东西作为答案:) - Michael IV


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

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

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

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


4
2018-02-14 17:50



是的,我明白了,但是你仍然建议默认使用交错可能意味着在大多数情况下这是最好的选择。 - Michael IV


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

GPU必须在渲染一个小矩形时前后移动顶点,法线和uvmaps,因为它无法将所有这些存储在自身内部的缓冲区中。

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

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


1
2018-05-12 18:16