结构的大小(包含顶点数据)是否会影响性能?
示例:
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);发布于 2014-04-19 18:00:21
是的,因为它将影响后续引用的总体位置(即,它们将得到较少的本地引用),因此会增加缓存丢失的数量,尤其是在顶点数量增加时。
在您的例子中,您没有将数组存储在GPU上,但是如果您对性能感兴趣,您应该这样做。OpenGL无法自动缓存这些内容,因为C中没有记账功能,可以让它判断自上次调用glVertexAttribPointer以来数组中的任何内容是否发生了变化。
当您进入GPU时,安排好缓存变得更加重要:GPU高度并行,但内存不是。因此,缓存丢失都落在共享资源上,因此多个同时丢失复合性能问题。
因此,您通常想要的是将与顶点相关的每一段数据放在一个块(位置、法线、切线、所有纹理坐标、光谱等)中,每个数据存储在绝对最低精度的容器中。如果你使用非常小的GPU,比如那些通常用于OpenGL ES的GPU,那么尽可能多地隐式并重新计算它(例如存储两个分量的法线,并根据法线作为单位长度存储在所有引擎中的99.9999% )的约束条件下,在着色器中计算出第三个GPU也更便宜。
https://stackoverflow.com/questions/23173068
复制相似问题