Каковы хорошие практики OpenGL ES 1.x? - PullRequest
0 голосов
/ 04 августа 2011

Я только начал работать с OpenGL ES в Android, но я полагаю, что это может пойти и на другие мобильные платформы, использующие OpenGL ES. Я прошел несколько уроков, чтобы начать, но я чувствую, что есть разные вещи, которые мне не хватает.

Например, хорошо ли, когда объекты рисуют сами по себе? У меня есть объект куба, который рисует сам, затем у меня есть объект «панель», представляющий собой массив кубиков 10х10, и, наконец, еще один объект, который состоит из панелей для создания объекта, подобного кубу. У меня есть 7500 кубов, которые нужно нарисовать, хотя каждый из них очень «маленький». Вот как выглядит функция рисования:

public void draw(GL10 gl) {
    gl.glFrontFace(GL10.GL_CCW);

    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glCullFace(GL10.GL_BACK);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer);

    gl.glColor4f(rgba[0], rgba[1], rgba[2], rgba[3]);

    gl.glTranslatef(x, y, z);
    gl.glRotatef(rx, 1, 0, 0);
    gl.glRotatef(ry, 0, 1, 0);
    gl.glRotatef(rz, 0, 0, 1);

    gl.glDrawElements(GL10.GL_TRIANGLES, numOfIndices,
                    GL10.GL_UNSIGNED_SHORT, indicesBuffer);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
}

Есть ли что-то, чего следует избегать при работе с OpenGL ES?

Редактировать: Еще одна вещь, которая меня интересует, это хорошая практика, чтобы уменьшить количество вызовов определенных методов, таких как

gl.glFrontFace(GL10.GL_CCW);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);

gl.glDisable(GL10.GL_CULL_FACE);

Это вызывается для каждого объекта при рисовании, является ли это необходимостью или его можно вызвать один раз в моем самом верхнем объекте один раз?

Также:

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

Я понимаю, что включение и отключение могут быть необходимы в зависимости от ситуации, но если этого можно избежать, это не окажет отрицательного влияния на что-либо?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Ваша производительность OpenGLES сильно зависит от вашего количества вызовов GL, так что попробуйте уменьшить количество вызовов. Если это ваше единственное место для рисования, нет необходимости каждый раз отключать cullface и массив вершин и помещать ваши включающие вызовы cull face только в метод инициализации, чтобы он включался только один раз.

1 голос
/ 04 августа 2011

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

РЕДАКТИРОВАТЬ: Вот пример из моего проекта.У меня есть несколько NPC, которые мне нужно рисовать и обновлять по отдельности, чтобы они двигались независимо друг от друга.

// update
    for (int i = 0; i < npcs.length; i++) {
        npcs[i].update(touchEvents);
    }

    // draw
    npcBatcher.beginBatch(Assets.atlas);
    for (int i = 0; i < npcs.length; i++) {
        npcs[i].draw(npcBatcher);
    }
    npcBatcher.endBatch();

В моем методе рисования я начинаю партию, добавляю к партии и, наконец, заканчиваю партию (котораяделает на самом деле рисунок).В методе обновления я перебираю каждый объект NPC и обновляю КАЖДЫЙ NPC.В методе обновления для объекта NPC я случайным образом генерирую несколько чисел и перемещаю их в соответствии со случайным числом (делаю всю логику, которая заставляет их вести себя по-разному).Поскольку у каждого NPC есть собственное обновление со случайными числами, все они действуют по-разному.Все рисование сделано за один раз.Рисование сразу не имеет значения, это обновление для каждого объекта, которое имеет значение и является тем, что вы ищете.

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