Intereting Posts
Android: adbd не может работать как root в производственных сборках Как превысить ограничение на 65535 байтов для кода метода Android InApp Billing v3 – тестирование с использованием нескольких устройств WebView не работает, запуская URL-адрес извне в браузере. Отображение веб-страницы внутри приложения App Отклонено от игрового магазина, «предназначенного для семей» Использование Tesseract для распознавания рукописного ввода GoogleMap внутри фрагмента в ViewPager, сохраняйте все события касания в GoogleMap Замена в приложении вызова Как сделать AAC доступным для HTTP-потока с помощью Android MediaPlayer? Super.onCreateView в фрагментах Во время прокрутки фоны ListView становятся черными – как исправить? Возможно ли создать виджет рабочего стола с реакцией-native? Как изменить Android-камеру на портрет в режиме просмотра поверхности? Об андроиде google api-streetview Как отключить «звуковой сигнал» от MediaRecorder.start ()?

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

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

Живые обои имеют контекст OpenGL, каждый раз, когда запускается полноэкранное приложение, и когда обои становятся видимыми снова, все шейдеры, текстуры и т. Д. Необходимо перезагрузить, заставляя экран замораживаться в течение 3 секунд каждый раз, Что неприемлемо для меня 🙁

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

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

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

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

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

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

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