Я написал OpenGL живые обои для Android, которые используют 17 пиксельных и 17 вершинных шейдеров. На моем HTC Legend они занимают около 3 секунд для загрузки и компиляции. Время загрузки составляет около 20% от этого, остальные компилируются.Как ускорить загрузку/компиляцию шейдеров на Android
Живые обои имеют контекст OpenGL, каждый раз, когда запускается полноэкранное приложение, и когда обои становятся видимыми снова, все шейдеры, текстуры и т. Д. Необходимо перезагрузить, в результате чего экран замерзнет примерно на 3 секунд, что неприемлемо для меня :(
Я проделал некоторое чтение и, по-видимому, невозможно предварительно скомпоновать шейдеры. Что еще я мог сделать, чтобы исправить это? Можно ли загружать и компилировать шейдеры в фоновая нить? В этом случае я мог бы показать какую-то анимацию прогресса. Не было бы здорово, но лучше, чем ничего ...
[EDIT1] Еще одна важная причина для ускорения это то, что весь жизненный цикл Live Wallpaper на основе OpenGL трудно нормально работать на всех устройствах (и это преуменьшение). Представляя длительные нагрузки, когда контекст потерян/воссоздан, добавляется больше головных болей, чем я хочу. Во всяком случае:
Как следует из ответа 1, я попытался посмотреть расширение GL_OES_get_program_binary, чтобы сделать какое-то компилируемое одноразовое скомпилированное-версию для установленного приложения, но меня беспокоит, насколько широко это расширение . Например, мой планшет с питанием Tegra2, похоже, не поддерживает его.
Другие подходы Я рассматривающие:
1) Ubershader: положить все пиксельные шейдеры в один большой шейдер, с выключателем или если заявления. Будет ли это резко замедлять пиксельные шейдеры? Изменит ли он шейдер слишком большой и заставит меня перегнать все эти подозрительные ограничения на регистрацию/подсчет команд/текстуры? Такая же идея для вершинных шейдеров. Это уменьшит мой весь shadercount до 1 пикселя и 1 вершинный шейдер и, надеюсь, сделает компиляцию/компоновку партий быстрее. Кто-нибудь пробовал это? [EDIT2] Я просто попробовал это. Не. Компиляция/увязка теперь занимает 8 секунд, прежде чем сдаться с неопределенной ошибкой «ссылка не удалась» :(
2) Загрузка фона для нехорошего человека: не загружайте и не компилируйте шейдеры в начале, но загружайте/скомпилируйте один шейдер за обновление кадра для первых 17 кадров. По крайней мере, я бы освежал дисплей, и я мог бы показать индикатор выполнения, чтобы пользователь увидел, что что-то происходит. Это будет хорошо работать на медленных устройствах, но на быстрых устройствах это, вероятно, сделает всю фазу нагрузки/компиляции шейдера медленнее, чем это необходимо ...
Вы нашли больше решений? – Zammbi
Нет. Теперь я загружаю все свои шейдеры в один кадр и рисую индикатор выполнения с помощью glViewport и glClear. Грустно, но это работает. –