Как стать автором
Обновить

Легко переходим на векторный формат картинок вместо нарезки под разные плотности экранов в Android 4.0+. Часть 1 из 2

Время на прочтение4 мин
Количество просмотров36K
Всего голосов 25: ↑24 и ↓1+23
Комментарии13

Комментарии 13

А можно сравнение по производительности и памяти с обычными картинками? И что с 9path?
9path — это (если не изменяет память) просто тянущиеся растровые картинки, они не масштабируются как векторные, а «тянутся».
Если быть совсем точным, то 9-patch.
Сравнение по производительности и памяти с обычными картинками – это тема для отдельной статьи, буду рад ее прочитать :) Рискну предположить, что с вектором все заметно лучше, чем с растром, во всяком случае ощущения, что приложение стало работать медленнее после перехода на вектор, не возникло, скорее наоборот.
9-patch поддерживается только для PNG.
Вектор еще нужно в растр переводить, а растр уже готов для отрисовки. Потому вектор аж никак не может быть быстрее растра, вопрос только, насколько он медленнее.
Вы забыли только, что PNG тоже декодировать надо, и не известно, что быстрее.
На самом деле чаще всего для отрисовки векторных изображений используется триангуляция и превращение векторных «путей» в 3д меши, которые рисуются напрямю видеокартой без текстур (крашеные вершины) или с простой лукап текстуркой с однопиксельными цветными квадратиками. Причём триангулировать и сохранять полученный результат можно заранее, например во время сборки приложения.

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

Я это собственно к тому, что по скорости отрисовки нельзя однозначно сказать, какой способ быстрее. Всё зависит от конкретного случая.
В играх — да, потому что там очень часто масштаб может меняться. VectorDrawable же кеширует результаты рендера, грубо говоря, в текстуру, и рисует именно растр, перерисовывая вектор только при необходимости.
Если брать VectorDravable из Android 5.0+ то там все векторные изображения кешируются. Так что существенного изменения производительности быть не должно.
На счет 9-patсh. Возможно вам поможет статья Программное создание NinePatchDrawable которую я написал пол года назад. К сожалению, в настоящее время у меня нет проектов, где можно было бы это использовать, так что библиотека из статьи пока не развивается.
точно также отрисовываются векторные шрифты: один раз генерятся их растровые глифы, которые потом и накладываются на картинку на каждой отрисовке.
«Легко… Часть 1 из 2.» Не так уж и легко, если пришлось на части делить.) Пожалуй, я лучше останусь со своими мэйкфайлами, которые автоматически генерируют «нарезку» из SVG:
Makefile
include make.rules

sport_icons = sport_running sport_biking sport_generic

icons: $(call iconset,$(sport_icons) )

icons_clean:
        rm -fv $(call iconset,$(sport_icons) )

make.rules
formats = xhdpi hdpi mdpi ldpi

iconset = $(foreach icon_name,$(1),$(addprefix res/drawable-,$(addsuffix /$(icon_name).png,$(formats))))

res/drawable-xhdpi/%.png: images/%.svg
        mkdir -p res/drawable-xhdpi
        inkscape -e $@ -C -w 96 -h 96 $<

res/drawable-hdpi/%.png: images/%.svg
        mkdir -p res/drawable-hdpi
        inkscape -e $@ -C -w 72 -h 72 $<

res/drawable-mdpi/%.png: images/%.svg
        mkdir -p res/drawable-mdpi
        inkscape -e $@ -C -w 48 -h 48 $<

res/drawable-ldpi/%.png: images/%.svg
        mkdir -p res/drawable-ldpi
        inkscape -e $@ -C -w 36 -h 36 $<
Хотя, конечно, нормальная поддержка SVG в Android — моя давняя мечта.
Каждый вправе выбирать подход по душе. Предложенный Вами вариант – это хорошее решение, но с минусом по сравнению с вектором: размер apk больше.
Все решают эти проблемы по-разному: кто-то пытается подключить SVG-библиотеку к проекту, кто-то генерирует нарезку с помощью утилиты.

А ещё есть Gradle плагин от Trello, генерирующий png drawables во время сборки проекта, и обещают в Android Gradle plugin версии 1.4 прикрутить официальную поддержку генерации png.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории