2012-01-03 3 views
4

Я написал 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 кадров. По крайней мере, я бы освежал дисплей, и я мог бы показать индикатор выполнения, чтобы пользователь увидел, что что-то происходит. Это будет хорошо работать на медленных устройствах, но на быстрых устройствах это, вероятно, сделает всю фазу нагрузки/компиляции шейдера медленнее, чем это необходимо ...

+0

Вы нашли больше решений? – Zammbi

+1

Нет. Теперь я загружаю все свои шейдеры в один кадр и рисую индикатор выполнения с помощью glViewport и glClear. Грустно, но это работает. –

ответ

3

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

+0

Я сделаю это, спасибо! Я предполагаю, что вы предлагаете мне скомпилировать их один раз, сначала выполнить, сохранить двоичные файлы и следующий раз, перезагрузить их? Для этого потребуется дополнительное разрешение на доступ к SD, но я полагаю, что смогу с этим справиться. Я уточню этот вопрос/ответ, когда узнаю больше. –

+0

ОК, попробовал это на двух устройствах, которыми я владею (HTC Legend и трансформатор Asus EEE). Результаты были немного удивительными: более старый, более слабый HTC Legend поддерживает это расширение, более новое, «потрясающее» NVidia Tegra2 этого не делает. С другой стороны, на Asus компиляция шейдеров занимает гораздо меньше времени (еще не приурочена, но определенно меньше секунды). Я немного обеспокоен тем, насколько широко эта команда была реализована различными поставщиками оборудования, и стоит ли мне потратить время на реализацию всей этой схемы кэширования ... –

+0

Как вы получаете двоичный файл от драйвера? – Zammbi

Смежные вопросы