优化OpenGL ES操作?

时间:2011-10-23 20:49:15

标签: opengl-es embedded

我正在使用以下代码在屏幕上绘制字符(每个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 个答案:

答案 0 :(得分:2)

实际上我认为您应该尝试限制对viewportglBindTextureglDrawArrays的通话量。

从技术上讲,你应该将所有角色打包在一个纹理中,这样你就可以将它绑定一次。

然后,你可以像实际那样在循环中计算顶点和texcoords,但是自己进行视口数学计算,并在CPU数组中累积结果。一旦你的数组构成,你应该提交一次绘制调用,提供这个数组。

你可能会在这里找到抱负:

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

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