OpenGL4.0中使用交错属性数组的性能增益



我使用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 
}

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

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

来自Vertex规范wiki页面:

一般来说,应该尽可能使用交错属性。显然,如果你需要改变某些属性,而不是其他属性,那么将改变的属性与不改变的属性交织在一起不是一个好主意。


性能增益理论上可以有多大?

我真的不能回答这个问题,但我不认为会有很大的进步。唯一确定的方法是测量。

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

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

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

只需交错你的属性。它不需要任何成本,只需要最少的时间或精力,而且在性能方面可能具有不小的价值。

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

具有数量的顶点和属性可能会显示性能差异。bigmany的值应通过分析来确定。

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

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

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

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

相关内容

  • 没有找到相关文章