Думал, переход на Impeller ускорит прил. А он похоронил его.
Скролл просел до 15 fps. На пустом экране. Где два десятка иконок и больше ничего.
Я три часа сидел с профайлером и не верил глазам. Каждая SVG-иконка перепарсивалась 60 раз в секунду. Заново. Каждый кадр.
Почему? Skia сохраняла растеризованный битмап в кэш и дальше просто показывала его. Impeller так не умеет — его кэширование явное, под контролем движка, и для SVG, загруженных через flutter_svg, этот кэш не работает. 20 иконок × парсинг XML + тесселяция + растеризация = рендер на 40 мс. А бюджет кадра на 60 fps — 16 мс. Ну то есть приехали.
Решение нашлось, но не сразу. Дэн Филд выкатил vector_graphics_compiler. Штука в том, что он переносит парсинг SVG с рантайма на момент сборки. На билде все векторные ассеты прогоняются через компилятор и упаковываются в бинарник, который Flutter жуёт напрямую — без XML, без тесселяции, без боли. На том же экране с 20 иконками рендер упал с 40 мс до 0.7 мс. 57-кратное ускорение. 60 fps стабильно.
Правда, есть нюанс. На форумах пишут, что для сложных SVG с кучей деталей vector_graphics_compiler иногда теряет точность. Не критично для иконок, но если у вас детализированная графика — лучше проверить.
Мой вывод после этой истории: если иконка статичная и не меняет цвет — конверчу в WebP и забываю. Если нужна векторизация (темизация, анимация) — vector_graphics_compiler. А тащить flutter_svg на Impeller без компиляции теперь считаю ошибкой.
А вы уже переходили на Impeller в продакшене? Я теперь вообще не понимаю, есть ли смысл в чистых векторах на мобилках или проще всё растром перекрыть и не париться?