Оптимизация работы OpenGL ES?

#opengl-es #embedded

#opengl-es #встроенный

Вопрос:

Я использую следующий код для рисования символов на экране (каждый символ UTF8 является текстурой):

 int row = 0;

glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glVertexPointer(2, GL_FLOAT, 0, vertices);

for (StdStr* line in _lines) {
    const char* str = [line cString];

    for (int i = 0; i < strlen(str); i  ) {
        ((XX::OGL::GLESContext*)context)->viewport(C_WIDTH*i,
                                                   C_HEIGHT*row,
                                                   C_WIDTH,
                                                   C_HEIGHT);

        glColor4f(1.0, 1.0, 1.0, 1.0);

        glBindTexture(GL_TEXTURE_2D, _textures[0]   *(str   i));
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);  
    }

    row  ;
}
 

Когда символов много, выполнение кода занимает больше времени. В этом случае почти 99% времени тратится на выполнение glDrawArrays процедуры. Возможно ли минимизировать количество вызовов glDrawArrays ? Версия OpenGL ES 1.1.

Ответ №1:

На самом деле я думаю, что вы должны попытаться ограничить количество вызовов viewport , glBindTexture и glDrawArrays .

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

Затем вы могли бы вычислять вершины и текстовые строки в цикле, как вы это делаете на самом деле, но самостоятельно выполняете математику окна просмотра и накапливаете результаты в массиве ЦП. После того, как ваш массив сформирован, вы должны отправить вызов рисования один раз, предоставив этот массив.

Вероятно, вы можете найти здесь inpiration:

http://www.angelcode.com/products/bmfont/

http://sourceforge.net/projects/oglbmfont/