Я немного изменил пример GLSprite для iPhone SDK, изучая OpenGL ES, и он оказался довольно медленным. Даже в симуляторе (на худшем уровне), поэтому я, должно быть, делаю что-то не так, потому что это всего 400 текстурированных треугольников.
const GLfloat spriteVertices[] = {
0.0f, 0.0f,
100.0f, 0.0f,
0.0f, 100.0f,
100.0f, 100.0f
};
const GLshort spriteTexcoords[] = {
0,0,
1,0,
0,1,
1,1
};
- (void)setupView {
glViewport(0, 0, backingWidth, backingHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0.0f, backingWidth, backingHeight,0.0f, -10.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.3f, 0.0f, 0.0f, 1.0f);
glVertexPointer(2, GL_FLOAT, 0, spriteVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_SHORT, 0, spriteTexcoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// sprite data is preloaded. 512x512 rgba8888
glGenTextures(1, &spriteTexture);
glBindTexture(GL_TEXTURE_2D, spriteTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
free(spriteData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
}
- (void)drawView {
..
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(tx-100, ty-100,10);
for (int i=0; i<200; i++) {
glTranslatef(1, 1, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
..
}
drawView вызывается при каждом касании экрана или перемещении пальца по экрану, и tx, ty устанавливаются в координаты x, y, где произошло это касание.
Я также пытался использовать GLBuffer, когда перевод был сгенерирован заранее, и был только один DrawArray, но он имел ту же производительность (~ 4 FPS).
=== РЕДАКТИРОВАТЬ ===
Тем временем я изменил это так, чтобы использовались гораздо меньшие квадраты (размером: 34x20), и было сделано намного меньшее перекрытие. На всем экране около 400 квадратов -> 800 треугольников. Размер текстуры - 512x512 атласа и RGBA_8888, в то время как координаты текстуры находятся в float.
Код очень уродлив с точки зрения эффективности API: есть два изменения MatrixMode вместе с двумя нагрузками и двумя трансляциями, а затем - отрисовки для треугольной полосы (четырехугольника).
Теперь это производит ~ 45 FPS.