У меня есть игра Open GL ES на iPhone. Моя частота кадров довольно сочная, ~ 20 кадров в секунду. Используя инструмент производительности Xcode OpenGL ES на iPhone 3G, он показывает:
Использование рендерера: от 95% до 99%
Использование Tiler: ~ 27%
Я рисую много довольно больших изображений с большим количеством смешивания. Если я уменьшу количество обращенных изображений, кадры начнутся от ~ 20 до ~ 40, хотя результаты инструмента производительности останутся примерно такими же (рендеринг все еще максимизирован). Я думаю, что меня ограничивает скорость заполнения iPhone 3G, но я не уверен.
Мои вопросы: как я могу определить с большей детализацией, где узкое место? Это моя самая большая проблема, я просто не знаю, что происходит все время. Если это fillrate, есть ли что-нибудь, что я делаю, чтобы улучшить его, а не рисовать меньше?
Я использую текстурные атласы. Я попытался свести к минимуму привязки к изображениям, хотя это не всегда возможно (порядок рисования, не все подходит для одной текстуры 1024x1024 и т.д.). Каждый кадр меняет 10 изображений. Это кажется довольно разумным, но я могу ошибаться.
Я использую вершинные массивы и glDrawArrays. У меня нет большой геометрии. Я могу попытаться быть более точным, если это необходимо. Каждое изображение состоит из двух треугольников, и я стараюсь, чтобы все было возможно, хотя часто (возможно, в половине случаев) изображения рисуются с помощью отдельных вызовов glDrawArrays. Помимо изображений, у меня есть ~ 60 треугольников, которые геометрия отображается в ~ 6 вызовах glDrawArrays. Я часто glTranslate перед вызовом glDrawArrays.
Будет ли улучшена частота кадров для переключения на VBOs? Я не думаю, что это огромное количество геометрии, но, возможно, это быстрее по другим причинам?
Есть ли определенные вещи, чтобы следить за тем, что может снизить производительность? Например, следует ли избегать glTranslate, glColor4g и т.д.
Я использую glScissor в 3-х местах за фрейм. Каждое использование состоит из 2 вызовов glScissor, один для его настройки и один для reset для того, что было. Я не знаю, есть ли здесь влияние на производительность.
Если бы я использовал PVRTC, он мог бы работать быстрее? В настоящее время все мои изображения GL_RGBA. У меня нет проблем с памятью.
Одна из моих полноэкранных текстур - 256х256. Было бы лучше использовать 480x320, чтобы телефон не делал никакого масштабирования? Есть ли другой общий совет по производительности для размеров текстур?
Вот приблизительное представление о том, что я рисую в следующем порядке:
1) Переключиться на перспективную матрицу. 2) Нарисуйте полноэкранное фоновое изображение 3) Нарисуйте полноэкранное изображение с прозрачностью (у этого есть прокручиваемая текстура). 4) Нарисуйте несколько спрайтов. 5) Переключитесь на орто-матрицу. 6) Нарисуйте несколько спрайтов. 7) Переключиться на перспективную матрицу. 8) Нарисуйте спрайты и другую текстурированную геометрию. 9) Переключитесь на орто-матрицу. 10) Нарисуйте несколько спрайтов (например, игровой HUD).
Шаги 1-6 нарисуют кучу фонового материала. 8 рисует большую часть игрового контента. 10 рисует HUD.
Как вы можете видеть, существует много слоев, некоторые из них полноэкранные, а некоторые спрайты довольно большие (1/4 экрана). Слои используют прозрачность, поэтому я должен нарисовать их в обратном порядке. Это дополнительно осложняется необходимостью рисовать различные слои в орто и других в перспективе.
Я с радостью предоставит дополнительную информацию, если она будет восстановлена. Заранее благодарю за любые рекомендации по производительности или общие советы по моей проблеме!
Edit:
Я добавил несколько журналов, чтобы узнать, сколько вызовов glDrawArrays я делаю, и сколько данных. Я делаю около 20 вызовов glDrawArray для каждого кадра. Обычно от 1 до 6 из них имеют около 40 вершин каждый. Остальные вызовы обычно всего 2 вершины (одно изображение). Я просто использую glVertexPointer и glTexCoordPointer.