我正在使用以下代码在屏幕上绘制字符(每个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。
答案 0 :(得分:2)
实际上我认为您应该尝试限制对viewport
,glBindTexture
和glDrawArrays
的通话量。
从技术上讲,你应该将所有角色打包在一个纹理中,这样你就可以将它绑定一次。
然后,你可以像实际那样在循环中计算顶点和texcoords,但是自己进行视口数学计算,并在CPU数组中累积结果。一旦你的数组构成,你应该提交一次绘制调用,提供这个数组。
你可能会在这里找到抱负: