2009-05-16 3 views
2

Я тестирую свою простую реализацию 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) 
+0

Можете ли вы разместить код? – zoul

+0

Как вы просили. :) – Kriem

ответ

0

Read this post.

512x512, вероятно, немного оптимистично для iPhone.

EDIT:

Я предполагаю, что вы уже читали, но если не check Apples guide to optimal OpenGl ES performance on iPhone.

+0

Я знаю, что 512x512 большой. Вопрос, о котором вы говорите, говорит, что тайлинг сделал трюк. Мое выполнение не приносит пользы от плитки вообще. Кроме того, что, если мой дизайн не дает мне возможность плитку? – Kriem

+0

черепица поможет вам только в том случае, если ваши объекты маленькие, попробуйте переместить объект вдали от камеры, он все еще занимает много графического процессора? –

+0

Извините, я забыл упомянуть, что это 2D-игра. Таким образом, нет буферизации глубины и без изменения нагрузки. – Kriem

0

Что именно проблема?
Вы получаете 60 кадров в секунду, что является шелковистой гладкой.

Кого волнует, если использование утилиты составляет 40%?

+0

Мне это показалось странным. Мне было интересно, может ли я что-то сделать неправильно. Убийство такого удара производительности может дать мне больше визуальных возможностей. – Kriem

+0

Я заметил, что текстура RGBA 256x512 с GL_LINEAR для фильтра min и mag стоит около 15% GPU на iPodtouch2G. Это много. Я все еще пытаюсь понять, что устройство любит и не нравится. Есть некоторые контр-интуитивные результаты. –

1

Я пишу приложение, которое отображает пять текстур 512x512 друг над другом в 2D-среде с использованием GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, и я могу получить около 14 кадров в секунду. Вам действительно нужно 60 кадров в секунду? Для игры, я думаю, 24-30 будет хорошо.Кроме того, используйте сжатие текстуры PVR, если это вообще возможно. Вот пример, который включает в себя SDK.

+2

Да, мне нужно столько кадров в секунду, сколько возможно. Я думаю, что это должно быть целью каждого игрового дизайнера. Чем больше fps., Тем плавнее. Несмотря на это, я согласен с вами в том, что достаточно 30 кадров в секунду и удовлетворяет требованиям качества. Проблема с PVR-текстурами - уродливые артефакты сжатия. Особенно с 2D спрайтами эти артефакты действительно пристают к опыту. – Kriem

0

Проблема может быть из-за размера кеша текстуры iPhone. Это может просто свести к тому, насколько текстура находится на каждом отдельном треугольнике, квадранте или tristrip, в зависимости от того, как вы устанавливаете состояние.

Попробуйте следующее: разделите свой квад и повторите свои тесты. Итак, если вы 1 квад, сделайте это 4. Затем 16. и так далее, и посмотрите, поможет ли это. Ключ состоит в том, чтобы уменьшить фактическое количество пикселей, которые ссылаются на примитивы.

После того, как кэш текстуры будет взорван, тогда оборудование перевернет поиск текстуры из основной памяти в любой vram, выделенный для буфера текстуры для каждого пикселя. Это может быстро убить производительность.

ИЛИ - Я совершенно не прав, потому что я действительно не знаю аппаратного обеспечения iPhone, и я также знаю, что чип PVR - странный зверь по сравнению с тем, к чему я привык (PS2, PSP). Тем не менее, это простой тест, и мне интересно, если это поможет.

+0

Это не помогло. Мой вывод был - по-видимому, правильным - что у iPhone плохая скорость заполнения. – Kriem

+0

Ах, хорошо бы знать. Является ли Apple опубликована спецификация скорости заполнения? Не догадался бы от вашего ответа. –

1
  1. Надеюсь, вы не забыли отключить GL_BLEND, когда он вам не нужен.
  2. Вы можете попытаться оптимизировать пропускную способность памяти - используйте 16 форматов bpp или PVRTC. ИМХО с кешем текстурной текстуры не помогает вообще.
  3. Не забывайте, что ваш фреймбуфер используется в качестве текстуры iPhone UI. Если он создан как 32-битный RGBA, он будет альфа-смешанным еще раз. Для оптимальной производительности лучше всего подходят 16-битные 565 фреймбуферов (но качество графики страдает).

Я не знаю всех деталей, таких как размер кеша, но, я полагаю, текстуры пикселей уже загружены при загрузке в видеопамять, а треугольники разделены движком PVR. Поэтому ваше собственное расщепление кажется излишним.

И, наконец. Это всего лишь мобильный маломощный графический процессор, который не предназначен для огромных экранов и высокого уровня заполнения. Альфа-смешивание является дорогостоящим, возможно, в 3-4 раза разницей в чипах PowerVR.