我使用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问题不会成为瓶颈,否则这无关紧要。
而且无法知道它的增益有多大,因为不同的硬件会有不同的响应。不同的情况会根据瓶颈的紧张程度做出不同的反应
只需交错你的属性。它不需要任何成本,只需要最少的时间或精力,而且在性能方面可能具有不小的价值。
交错属性数组的好处是内存局部性。这意味着所有必要的顶点数据都位于彼此相邻的位置,并且与位于多个缓冲器中的数据相比,可以更有效地提取顶点数据。
具有大数量的顶点和多属性可能会显示性能差异。big和many的值应通过分析来确定。
我可能错了,但我的看法是,GPU在渲染三角形的顶点时需要数据(顶点、法线和uv贴图),如果顶点、法线的缓冲区和uv贴图对于对象来说很大,例如大球体(用glvertex而不是glsphere渲染)。。。
GPU在渲染一个小矩形时必须来回查找顶点、法线和uvmap,因为它无法将所有这些都存储在自己内部的缓冲区中。
总线上的通信通常比处理器速度慢。
现在,在这种情况下,交错阵列是一个很大的增益,并减少了总线通信,GPU可以轻松处理交错阵列,并将具有可用于渲染的特定顶点集的所有数据。