结构的大小(包含顶点数据)是否会影响性能?
示例:
struct VertexData1 {
float x, y, z;
}
struct VertexData1 {
float x, y, z;
float variable1, variable2; //any amount of variables
}
现在,之间会有任何性能差异:
struct VertexData1 d1;
glVertexAttribPointer(index, 3, GL_FLOAT, GL_FALSE, sizeof(struct VertexData1), &d1.x);
VS
struct VertexData2 d2;
glVertexAttribPointer(index, 3, GL_FLOAT, GL_FALSE, sizeof(struct VertexData2), &d2.x);
答案 0 :(得分:1)
是的,因为它会影响后续引用的整体局部性(即,它们会减少本地化),因此会增加缓存未命中数,尤其是当顶点数量增加时。
在您的情况下,您不会将阵列存储在GPU上,但如果您对性能感兴趣,那么您应该这样做。 OpenGL无法自动缓存这些东西,因为在C中没有任何簿记可以让它判断自上次调用glVertexAttribPointer
以来阵列中的任何内容是否发生了变化。
一旦你推动GPU进入GPU,安排自己进行良好的缓存变得更加重要:GPU非常平行,但内存并非如此。因此,缓存未命中全部落在共享资源上,因此多个同时发生复合性能问题。
所以你通常想要的是将每个与顶点相关的数据组合成一个块(位置,法线,切线,所有纹理坐标,镜面反射等等),每个块都存储在绝对最低精度容器中可以逃脱。如果你使用像通常用于OpenGL ES的那些非常小的GPU,那么尽可能多地隐含并重新计算它也会更便宜 - 例如存储一个双分量法线,并根据法线在所有引擎的99.9999%中以单位长度存储的约束来计算出着色器中的第三个法线。