Я немного изменил пример 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, а координаты текстуры - плавающие. Код очень уродлив с точки зрения эффективности API: есть два изменения MatrixMode вместе с двумя загрузками и два перевода, а затем вытяжные массивы для треугольной полосы (четырехугольника). Теперь это дает ~ 45 FPS.