Как ускорить загрузку / компиляцию шейдеров на Android - PullRequest
4 голосов
/ 04 января 2012

Я написал живые обои OpenGL для Android, которые используют 17 пиксельных и 17 вершинных шейдеров.На моем HTC Legend загрузка и компиляция занимает около 3 секунд.Время загрузки составляет около 20% от этого, остальное компилируется.

У живых обоев контекст OpenGL уничтожается при каждом запуске полноэкранного приложения, и когда обои снова становятся видимыми, все шейдеры, текстурыи так далее, необходимо перезагрузить компьютер, заставляя экран зависать примерно на 3 секунды каждый раз, что для меня неприемлемо: (

Я немного читал и, по-видимому, прекомпилировать шейдеры невозможно.Что еще я мог сделать, чтобы это исправить? Можно ли загружать и компилировать шейдеры в фоновом потоке? Я мог бы показать некоторую анимацию прогресса в этом случае. Это было бы не здорово, но лучше, чем ничего ...

[EDIT1] Еще одна важная причина для ускорения этого процесса заключается в том, что весь жизненный цикл Live Wallpaper на основе OpenGL трудно правильно настроить на всех устройствах (и это является преуменьшением).пересоздание добавляет больше головных болей, чем я хочу. Во всяком случае:

Как следует из ответа 1, я попытался ЛооКороль в расширении GL_OES_get_program_binary, чтобы создать какое-то приложение «компилировать один раз в магазине, скомпилировать версию для каждого установленного», но я беспокоюсь о том, насколько широко это расширение реализовано.Например, мой планшет на Tegra2, похоже, не поддерживает его.

Другие подходы, которые я рассматриваю:

1) Ubershader: объединение всех пиксельных шейдеров в один большой шейдер с помощью переключателя илиесли заявления.Это сильно замедлит пиксельный шейдер?Это сделает шейдер слишком большим и заставит меня выйти за пределы всех этих надоедливых ограничений регистра / количества команд / поиска текстур?Та же идея для вершинных шейдеров.Это сократит весь мой счетчик шейдеров до 1 пикселя и 1 вершинного шейдера и, надеюсь, ускорит компиляцию / компоновку.Кто-нибудь пробовал это?[EDIT2] Я только что попробовал это.Не.Компиляция / компоновка теперь занимает 8 секунд, прежде чем сдаваться с неопределенной ошибкой «ошибка связи»: (

2) Плохая фоновая загрузка: не загружать / компилировать шейдеры в начале, но загружать / компилироватьобновление шейдера на кадр для первых 17 кадров.По крайней мере, я бы обновлял дисплей и мог показывать индикатор выполнения, чтобы пользователь видел, что что-то происходит.Это будет хорошо работать на медленных устройствах, но на быстрых устройствах это, вероятно, сделает фазу загрузки / компиляции всего шейдера медленнее, чем нужно ...

1 Ответ

3 голосов
/ 04 января 2012

Проверьте, поддерживает ли ваша реализация OES_get_program_binary.

...