оптимизация iPhone OpenGL ES заполняет уровень

У меня есть Открыть игра GL ES на iPhone. Мой framerate является симпатичным sucky, ~20fps. Используя OpenGL XCode инструмент производительности ES на iPhone 3G, это показывает:

Использование рендерера: 95% к 99%

Использование Tiler: ~27%

Я рисую много довольно больших изображений с большим смешиванием. Если я сокращаю количество оттянутых изображений, framerates идут от ~20 до ~40, хотя результаты инструмента производительности остаются о том же (рендерер все еще maxed). Я думаю, что ограничиваюсь уровнем заливки iPhone 3G, но я не уверен.

Мои вопросы: Как я могу определить с большим количеством гранулярности, где узкое место? Это - моя самая большая проблема, я просто не знаю то, что берет все время. Если это - fillrate, есть ли что-нибудь, что я делаю для улучшения его помимо просто рисования меньше?

Я использую атласы структуры. Я попытался минимизировать изображение, связывает, хотя это не всегда возможно (тянущий порядок, не все соответствует на одном 1024x1024 структура, и т.д.). Каждый кадр я делаю 10 изображений, связывает. Это кажется довольно разумным, но я мог ошибиться.

Я использую массивы вершины и glDrawArrays. У меня действительно нет большой геометрии. Я могу попытаться быть более точным в случае необходимости. Каждое изображение является 2 треугольниками, и я пытаюсь обработать вещи в пакетном режиме, были возможны, хотя часто (возможно, половина времени) изображения оттянуты с отдельными вызовами glDrawArrays. Помимо изображений, у меня есть ~60 ценности треугольников геометрии, представляемой в вызовах ~6 glDrawArrays. Я часто glTranslate прежде, чем назвать glDrawArrays.

Это улучшило бы framerate для переключения на VBOs? Я не думаю, что это - огромная сумма геометрии, но возможно это быстрее по другим причинам?

Там определенные вещи состоят в том, чтобы не упустить, который мог уменьшить производительность? Например, я должен избежать glTranslate, glColor4g, и т.д.?

Я использую glScissor в 3 места на кадр. Каждое использование состоит из 2 вызовов glScissor, один для установки его, и один для сброса его к тому, каково это было. Я не знаю, существует ли большая часть влияния производительности здесь.

Если бы я использовал PVRTC, то он смог бы представить быстрее? В настоящее время все мои изображения являются GL_RGBA. У меня нет проблем памяти.

Одна из моих полноэкранных структур 256x256. Было бы лучше использовать 480x320, таким образом, телефон не должен делать никакого масштабирования? Есть ли общий совет производительности для размеров структуры?

Вот общее представление о том, что я тяну в этом порядке:

1) Переключитесь на перспективную матрицу. 2) Потяните полноэкранное фоновое изображение, 3) Рисуют полноэкранное изображение с полупрозрачностью (у этого есть структура прокрутки). 4) Потяните несколько спрайтов. 5) Переключитесь на ortho матрицу. 6) Потяните несколько спрайтов. 7) Переключитесь на перспективную матрицу. 8) Потяните спрайты и некоторую другую текстурированную геометрию. 9) Переключитесь на ortho матрицу. 10) Потяните несколько спрайтов (например, игра HUD).

Шаги 1-6 тянут набор фонового материала. 8 тянет большую часть игрового содержания. 10 тянет HUD.

Как Вы видите, существует много слоев, некоторые из них, полный экран и некоторые спрайты является довольно большим (1/4 экрана). Слои используют полупрозрачность, таким образом, я должен потянуть их в наоборот порядке. Это далее сложно путем необходимости потянуть различные слои в ortho и других в перспективе.

Я с удовольствием предоставлю дополнительную информацию если reqested. Заранее спасибо за любые подсказки по производительности или общие рекомендации по моей проблеме!

Править:

Я добавил некоторый вход для наблюдения, сколько называет glDrawArrays, я делаю, и со сколько данных. Я делаю приблизительно 20 вызовов glDrawArray на кадр. Обычно приблизительно 1 к максимум 6 из них имеет приблизительно 40 вершин каждый. Остальная часть вызовов является обычно всего 2 вершинами (одно изображение). Я просто использую glVertexPointer и glTexCoordPointer.

12
задан NateS 7 May 2010 в 01:54
поделиться

4 ответа

Учитывая, что использование средства визуализации в основном установлено на 100%, это указывает на то, что узким местом является заливка, текстурирование и смешивание пикселей. Методы, предназначенные для оптимизации обработки вершин (VBO и форматы вершин) или использования ЦП (пакетирование вызовов отрисовки), скорее всего, не помогут, поскольку они не ускорят обработку пикселей.

Лучше всего уменьшить количество заполняемых пикселей, а также изучить различные форматы текстур, которые лучше используют очень ограниченную полосу пропускания памяти, доступную на устройствах первого поколения. По возможности предпочитайте использование текстур PVRTC, в противном случае - 16-битных несжатых текстур.

7
ответ дан 2 December 2019 в 20:39
поделиться

Обратитесь к рекомендациям Apple « Рекомендации по работе с данными текстуры » и « Рекомендации по работе с данными вершин Руководстве по программированию OpenGL ES для iPhone OS . Они настоятельно рекомендуют (как и другие) использовать PVRTC для сжатия текстур, поскольку они могут предложить степень сжатия 8: 1 или 16: 1 по сравнению со стандартными несжатыми текстурами. Помимо mipmapping, вы, похоже, выполняете другую рекомендуемую оптимизацию, используя атлас текстур.

Похоже, вы не ограничены геометрией, потому что (как я обнаружил в этот вопрос ) статистика использования плитки, кажется, указывает, насколько узкое место вызвано размером геометрии. Однако iPhone 3G S (а также iPod touch и iPad третьего поколения) поддерживает VBO с аппаратным ускорением, так что вы можете попробовать их и посмотреть, как они влияют на производительность. Они могут не иметь такого большого эффекта, как сжатие текстур, но их несложно реализовать.

3
ответ дан 2 December 2019 в 20:39
поделиться

Самым большим падением производительности на платформе iPhone является количество вызовов отрисовки и изменений состояния. Если вы выполняете более 20 вызовов отрисовки или изменения состояния, вы столкнетесь со стеной производительности.

Пакетные атласы и текстурные атласы - ваш друг.

0
ответ дан 2 December 2019 в 20:39
поделиться

В аналогичной ситуации (перенос приключенческой 2D-игры на iPad). Моя версия 3GS работала более или менее заблокированно со скоростью 60 кадров в секунду, поставил ее на iPad, упал (и моя челюсть) до 20 кадров в секунду.

Оказывается, ОДНА из маленьких ошибок заключается в том, что карты PVR ненавидят GL_ALPHA_TEST; на ПК, что на самом деле имеет небольшой положительный эффект (особенно на более старых чипах Intel), но они убивают скорость заполнения на iPhone. Изменение этого параметра на

 glDisable(GL_ALPHA_TEST);

дало мне мгновенное 100% повышение FPS (до 40 FPS). Неплохо для одной строчки кода .. :)

Аллан

1
ответ дан 2 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: