Советы по улучшению скорости заполнения OpenGL ES на Android - PullRequest
8 голосов
/ 02 марта 2011

В моих живых обоях я рисую 3 текстурированных квадрата, которые покрывают весь экран.На Nexus One я получаю 40fps.Я ищу способы повышения производительности.

Четыре квадрата смешаны друг с другом, текстуры загружаются из растровых изображений RGB_8888.Текстуры имеют размер 1024x1024.

У меня есть

glDisable(GL_DITHER);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
glDisable(GL10.GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

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

  • Уменьшите размер текстуры до 512x512и 256x256
  • Использовать расширение draw_texture
  • Отключить смешивание
  • Изменить фильтрацию текстуры с GL_LINEAR на GL_NEAREST
  • Использовать VBO (отчаянная попытка, поскольку всего 3 квадратора)...)
  • Запуск кода рисования в автономном режиме (если живые обои как-то влияют на производительность)

Если я рисую 2 слоя вместо 3, fps возрастает до 45или около того, тогда при рисовании всего 1 слоя число кадров в секунду возрастает до 55. Я предполагаю, что я ограничен скоростью заполнения, поскольку отключение и включение потенциально дорогостоящих функций приводят к тому же самому кадру в секунду, и единственное, что, по-видимому, улучшает число кадров в секунду, этопросто рисую меньше ...

Я размышляю над идеей сжатия текстур, но поддержка различных форматов сжатия не кажется забавной.ETC1 не имеет альфа-канала, который мне нужен, и я не уверен, что PVRTC и ATITC можно использовать даже из Java и OpenGL ES 1.0 или 1.1.

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

Ответы [ 3 ]

5 голосов
/ 02 марта 2011

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

  • вызов glClear в начале вашего кадра, вероятно, не нужен
  • вы могли бы сделатьпервый проход с отключенным смешиванием

Кроме того, вы пытались сделать это за 1 проход с использованием мультитекстурирования?

edit: И еще одна вещь: запись в z-буферне требуется, поэтому либо используйте контекст без z-буфера, либо отключите глубинную запись с помощью glDepthMask(GL_FALSE).

3 голосов
/ 02 марта 2011

glCompressedTexImage2D доступно в Java (и NDK), однако доступный формат сжатия зависит от графического процессора.

Файл AndroidManifest.xml> support-gl-texture

  • PowerVR SGX - Nexus S, Galaxy S / Tab, DROID - PVRTC
  • Adreno - Nexus One, EVO - ATITC
  • Tegra2 - Xoom, Atrix - S3TC

Если вы используете этот формат сжатия и хотите поддерживать различные устройства Android, вы должны подготовиться ко многим сжатым текстурам, но собственная текстура сжатия GPU должна улучшить производительность рендеринга.

1 голос
/ 23 сентября 2011

Фреймворк Android OpenGL min3d способен рисовать эти объекты или сцены с полными 60 кадрами в секунду.

Фреймворк с открытым исходным кодом и доступен для скачивания и использования по адресу: http://code.google.com/p/min3d/

Я бы порекомендовал сравнить ваш код с ним, чтобы увидеть, что вы сделали неправильно / по-другому, чтобы улучшить вашу производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...