这些矩形是作为数组"结构创建的吗?或作为"结构阵列"?

时间:2011-11-30 16:54:23

标签: iphone ios opengl-es

Apple正在谈论avoiding creating a "struct of arrays" and preferring "array of structs"以获得更好的内存性能。

在下面的例子中,我们创建了一个巨大的彩色矩形网格(32 x 48个,每个10 x 10个大)。这会生成“阵列结构”吗?只是想知道我的周末有多糟糕......

- (void)drawFrame {
    // draw grid
    for (int i = 0; i < numRectangles; i++) {
        // ... calculate CGPoint values for vertices ...

        GLshort vertices[ ] = {
            bottomLeft.x, bottomLeft.y,
            bottomRight.x, bottomRight.y,
            topLeft.x, topLeft.y,
            topRight.x, topRight.y
        };

        glVertexPointer(2, GL_SHORT, 0, vertices);           
        glColor4f(r, g, b, 1);

        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    }
}

1 个答案:

答案 0 :(得分:1)

这只是一个循环,为一个矩形制作一个坐标数组。你不涉及结构。他们专门讨论插值顶点,颜色和纹理坐标。由于您只是设置颜色并仅传递顶点,因此无法进行插值。

如果您的网格坐标是常量,您可以通过在初始化期间仅使用所有顶点填充一个大数组来查看性能提升。

然后,您可以将first参数递增到glDrawArrays以逐步执行数组并绘制单个rects,从而简化渲染循环中的内存操作(因为您已经在数组中有顶点每个渲染调用)。

// assuming you know the numbers beforehand
// also you should probably put this in a property
GLshort gridVerts[numRectangles][8];

- (void)init() {
    for (int i = 0; i < numRectangles; i++) {
        // calculate the vertices

        GLshort vertices[] = {
            bottomLeft.x, bottomLeft.y,
            bottomRight.x, bottomRight.y,
            topLeft.x, topLeft.y,
            topRight.x, topRight.y
        };

        memcpy(&gridVerts[i][0], vertices, sizeof(GLshort) * 8));
    }
}

- (void)drawFrame() {
    glVertexPointer(2, GL_SHORT, 0, gridVerts);

    for (int i = 0; i < numRectangles; i++) {
        // calculate the color for this iteration
        glColor4f(r, g, b, 1);

        glDrawArrays(GL_TRIANGLE_STRIP, i * 4, 4);
    }
}

要回答关于结构数组的原始问题,Vertex Buffers in opengl有一个例子。