Я тестирую свою простую реализацию OpenGL ES (2D-игру) на iPhone и Я замечаю высокий уровень использования рендеринга при использовании профилировщика. Таковы факты:512x512 Текстура, вызывающая огромный GPU-стресс на iPhone, несмотря на черепицу
- Я отображая только один поджат большой текстуры (512x512 пикселей) на 60fps и использование визуализации составляет около 40%.
- Моя текстура смешивается с использованием
GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
, единственной функцией GL, которую я использую. - Я попытался сделать текстуру более мелкой и черепичной ее, которая не имеет значения.
- Я использую PNG текстур атлас из 1024х1024 пикселей
Я нахожу это очень странным, что это одна текстура вызывает такое интенсивное использование GPU.
Этого можно ожидать? Что я делаю неправильно?
EDIT: Мой код:
// OpenGL setup is identical to OpenGL ES template
// initState is called to setup
// timer is initialized, drawView is called by the timer
- (void) initState
{
//usual init declarations have been omitted here
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
glEnableClientState (GL_VERTEX_ARRAY);
glVertexPointer (2,GL_FLOAT,sizeof(Vertex),&allVertices[0].x);
glEnableClientState (GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer (2,GL_FLOAT,sizeof(Vertex),&allVertices[0].tx);
glEnableClientState (GL_COLOR_ARRAY);
glColorPointer (4,GL_UNSIGNED_BYTE,sizeof(Vertex),&allVertices[0].r);
}
- (void) drawView
{
[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat width = backingWidth /2.f;
GLfloat height = backingHeight/2.f;
glOrthof(-width, width, -height, height, -1.f, 1.f);
glMatrixMode(GL_MODELVIEW);
glClearColor(0.f, 0.f, 0.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
[self checkGLError];
}
EDIT: Я сделал несколько улучшений, но никто не удалось снизить использование визуализации. Я разделил текстуру в частях 32x32, изменил тип координат и координаты текстуры от GLfloat до GLshort и добавил дополнительные вершины для дегенеративных треугольников.
Обновления являются:
initState: (вершина и указатель текстуры теперь GL_SHORT)
glMatrixMode(GL_TEXTURE);
glScalef(1.f/1024.f, 1.f/1024.f, 1.f/1024.f);
glMatrixMode(GL_MODELVIEW);
glScalef(1.f/16.f, 1.f/ 16.f, 1.f/ 16.f);
drawView:
glDrawArrays(GL_TRIANGLE_STRIP, 0, 1536); //(16*16 parts * 6 vertices)
Можете ли вы разместить код? – zoul
Как вы просили. :) – Kriem