Я работаю над приложением для iPhone, которое сильно зависит от OpenGL. Прямо сейчас он работает немного медленно на iPhone 3G, но выглядит быстро на новом 32G iPod Touch. Я предполагаю, что это связано с аппаратным обеспечением. В любом случае, я хочу, чтобы производительность iPhone напоминала производительность iPod Touch. Я полагаю, что я делаю много вещей неоптимально в OpenGL, и я хотел бы получить совет о том, какие улучшения дадут мне максимальную отдачу.
Рендеринг моей сцены выглядит примерно так:
- Повторите 35 раз
- glPushMatrix
- glLoadIdentity
- glTranslate
- повторите 7 раз
- glBindTexture
- glVertexPointer
- glNormalPointer
- glTexCoordPointer
- glDrawArrays (GL_TRIANGLES, ...)
- glPopMatrix
Мои координаты вершин, нормалей и текстур уже чередуются.
Итак, какие шаги я должен предпринять, чтобы ускорить это? Какой шаг ты бы попробовал первым?
Моя первая мысль - устранить все эти вызовы glBindTexture () с помощью Атласа текстур.
А как насчет более эффективных матричных операций? Я понимаю, что версии gl * () не слишком эффективны.
А как насчет VBO?
Обновление
Есть 8260 треугольников.
Размеры текстур - 64x64 png. Есть 58 различных текстур.
Я не запускал инструменты.
Обновление 2
После запуска инструмента OpenGL ES на iPhone 3G я обнаружил, что моя утилита Tiler находится в диапазоне 90-100%, а моя утилита рендеринга - в 30%.
Обновление 3
Texture Atlasing не оказала заметного влияния на проблему. Диапазоны использования остаются такими же, как указано выше.
Обновление 4
Преобразование моих вершинных и нормальных указателей в GL_SHORT, казалось, улучшило FPS, но использование Tiler все еще находится в диапазоне 90% в большинстве случаев Я все еще использую GL_FLOAT для моих текстурных координат. Я полагаю, что смогу свести их к GL_SHORT и сохранить еще четыре байта на вершину.
Обновление 5
Преобразование моих текстурных координат в GL_SHORT привело к еще одному увеличению производительности. Теперь я постоянно получаю> 30 FPS. Коэффициент использования плит по-прежнему составляет около 90%, но часто падает в диапазоне 70-80%. Использование Renderer колеблется около 50%. Я полагаю, это может быть связано с масштабированием координат текстуры из матричного режима GL_TEXTURE.
Я все еще ищу дополнительные улучшения. Я хотел бы приблизиться к 40 кадрам в секунду, поскольку это то, что получает мой iPod Touch, и оно там плавное и плавное. Если кто-то все еще обращает на себя внимание, то какие еще низкие фрукты я могу выбрать?