Созданы ли эти прямоугольники как «структура массивов» или как «массив структур»? - PullRequest
0 голосов
/ 30 ноября 2011

Apple говорит о избегании создания «структуры массивов» и предпочтении «массива структур» для гораздо лучшей производительности памяти.

В приведенном ниже примере мы создаем огромную сеткуцветных прямоугольников (32 х 48 канатов, каждый размером 10 х 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 Ответ

1 голос
/ 30 ноября 2011

Это просто цикл, создающий массив координат для одного прямоугольника.Вы не задействуете структуры.Они конкретно говорят о интерполяции координат вершин, цветов и текстур.Поскольку вы просто устанавливаете цвет и пропускаете только вершины, интерполяция не требуется.

Если ваши координаты сетки постоянны, вы можете увидеть увеличение производительности, заполнив большой массив всеми вершинами только один раз за времяinit.

Затем можно увеличить аргумент first до glDrawArrays , чтобы пройти по массиву и нарисовать отдельные фрагменты, упрощая операции с памятью в цикле рендеринга (поскольку у вас уже естьвершин в массиве для каждого вызова рендеринга).

// 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);
    }
}

Чтобы ответить на первоначальный вопрос о массивах структур, Буфер вершин в opengl имеет пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...