我使用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也是如此吗?如果是,那么理论上性能增益有多大?
答案 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可以轻松处理交错数组,并且可以为呈现的特定顶点集提供所有数据。