Impeller — это современный движок рендеринга для Flutter, разработанный Google для замены Skia и устранения её фундаментальных проблем: шейдерных лагов (jank) при первой отрисовке кадров, высокого потребления памяти и сложности поддержки разных графических бэкендов. В отличие от Skia, Impeller компилирует шейдеры заранее (offline), использует SPIR-V как промежуточное представление и работает напрямую с Vulkan, Metal и Direct3D 12. По данным Flutter Team (2025), Impeller устраняет до 95% шейдерных лагов, обеспечивая предсказуемый 60 FPS даже на устройствах начального уровня.
Главное
Impeller — это графический движок рендеринга с открытым исходным кодом, написанный на C++, который разрабатывается командой Flutter для замены Skia в качестве основного рендерера. Проект был анонсирован в 2021 году как ответ на многолетнюю проблему shader jank, от которой страдает Skia. Impeller не является форком Skia — это полностью новая реализация, спроектированная с учётом ограничений мобильных GPU и современных графических API.
Основная идея Impeller заключается в переносе компиляции шейдеров на этап сборки приложения, а не во время выполнения. В Skia шейдеры компилируются при первом использовании, когда пользователь уже взаимодействует с приложением. Impeller компилирует все шейдеры заранее (offline), упаковывает их в бинарный формат SPIR-V и поставляет вместе с приложением. Во время выполнения Impeller загружает предварительно скомпилированные шейдеры, что исключает задержки на компиляцию.
Impeller также решает проблему потребления памяти. Skia создаёт множество временных объектов (текстур, буферов) в процессе рендеринга, что приводит к фрагментации памяти на устройствах с ограниченными ресурсами. Impeller использует пулы памяти (memory pools) и переиспользует выделенные ресурсы, снижая пиковое потребление памяти на 30–40%.
SPIR-V (Standard Portable Intermediate Representation) — это промежуточное представление шейдеров, разработанное Khronos Group. Impeller использует SPIR-V как универсальный формат для всех шейдеров. На этапе сборки шейдеры на языке Impeller (собственный C++ DSL для описания эффектов) компилируются в SPIR-V. Во время выполнения SPIR-V загружается и транслируется в специфичный для платформы формат — MSL для Metal, GLSL для Vulkan или DXIL для Direct3D 12.
Архитектура Impeller состоит из нескольких слоёв, каждый из которых выполняет строго определённую задачу: обработка списка команд рендеринга, управление ресурсами GPU и выполнение шейдеров. Такая модульность позволяет легко добавлять поддержку новых графических API.
Нижний слой — это абстракция над графическим API (Vulkan, Metal, Direct3D 12). Impeller не поддерживает OpenGL, так как OpenGL не предоставляет возможностей для эффективной offline-компиляции шейдеров. На этом уровне реализованы: управление буферами вершин, создание и кэширование пайплайнов (графических конвейеров), синхронизация GPU. Пайплайн в Impeller — это предварительно скомпилированное состояние GPU, которое включает шейдеры, настройки растеризации и blending. Все пайплайны создаются на этапе инициализации, что исключает компиляцию во время рендеринга.
Средний слой — это система управления ресурсами. Она выделяет и переиспользует GPU-ресурсы: текстуры, буферы, сэмплеры. Вместо создания новой текстуры при каждом кадре, Impeller держит пул текстур различных размеров и форматов. Пул памяти автоматически возвращает неиспользуемые ресурсы и может расширяться при необходимости, но без фрагментации, характерной для Skia.
Верхний слой — это рендеринговый граф, в который Flutter Engine преобразует команды Canvas API. Impeller принимает Display List (список команд рисования) и строит из него граф зависимостей операций. Граф оптимизируется: удаляются лишние проходы рендеринга, объединяются операции с одинаковым состоянием GPU. Затем граф компилируется в последовательность вызовов Vulkan/Metal с использованием предварительно созданных пайплайнов.
Каждый кадр проходит через фиксированный конвейер: Display List → рендеринговый граф → компиляция графа → отправка команд GPU. Дополнительные проходы могут добавляться для пост-эффектов (размытие, тени) или подготовки буфера глубины. Время кадра в Impeller более предсказуемо, чем в Skia, так как отсутствуют недетерминированные задержки на компиляцию шейдеров.
Сравнение Impeller и Skia показывает различия в подходе к рендерингу. Skia — это универсальная 2D-библиотека общего назначения, а Impeller — специализированный движок для Flutter, оптимизированный под требования мобильного UI.
| Параметр | Skia | Impeller |
|---|---|---|
| Шейдеры | Компиляция на лету (runtime) | Offline-компиляция (build time) |
| Shader jank | 50–200 мс на первый кадр | Отсутствует (0 мс) |
| Формат шейдеров | Собственный (SkSL) | SPIR-V (универсальный) |
| GPU бэкенды | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| Потребление памяти | Высокое (временные текстуры) | Пулы памяти, до -40% |
| Платформы | Android, iOS, Web, Desktop | Android, iOS, Desktop |
| Статус | Стабильный (основной) | Preview (замена Skia) |
Ключевое различие — подход к шейдерам. Skia компилирует шейдеры в момент использования, создавая shader jank при первом рендеринге незнакомых эффектов. Impeller исключает это за счёт offline-компиляции. Также Skia поддерживает OpenGL, что необходимо для веб-версии Flutter, но Impeller отказывается от OpenGL в пользу более современных API, что даёт лучшую производительность на мобильных устройствах.
Для приложений Flutter переход на Impeller не требует изменения кода. Impeller реализует тот же Canvas API, что и Skia, поэтому все виджеты, анимации и кастомные рисования работают одинаково. Обратная совместимость обеспечивается на уровне Flutter Engine — движок выбирает рендерер (Skia или Impeller) на этапе инициализации приложения.
Impeller даёт несколько измеримых преимуществ по сравнению со Skia, которые напрямую влияют на пользовательский опыт и производительность приложений Flutter.
Shader jank — главная проблема Skia, которую Impeller решает полностью. Когда Flutter-приложение отображает новый экран с градиентами, масками или нестандартными блендами, Skia компилирует шейдеры во время анимации, что приводит к пропуску кадров. Impeller компилирует все шейдеры на этапе сборки, поэтому первый кадр отрисовывается так же быстро, как и последующие. На устройствах с медленным GPU (MediaTek Helio, Qualcomm 400 series) разница особенно заметна — до 200 мс задержки на каждый новый тип эффекта в Skia против 0 мс в Impeller.
Impeller использует пулы ресурсов для управления памятью GPU. В Skia каждый кадр может создавать новые текстуры для временных поверхностей, особенно при рендеринге с прозрачностью или применении saveLayer. Impeller переиспользует текстуры между кадрами, что снижает пиковое потребление памяти на 30–40% на Android и до 25% на iOS. Это особенно важно для приложений с длинными списками и анимациями, где Skia могла вызывать OOM-ошибки на устройствах с 2 ГБ RAM.
В Skia время рендеринга кадра может варьироваться в зависимости от того, какие шейдеры уже скомпилированы. Первый кадр с новым эффектом может занимать 50–200 мс, в то время как последующие — 3–5 мс. Эта непредсказуемость затрудняет оптимизацию и тестирование. Impeller обеспечивает равномерное время кадра, так как все шейдеры уже скомпилированы, и распределение памяти предсказуемо. Flutter Engine с Impeller может точнее рассчитывать бюджет времени на каждый кадр.
Impeller работает напрямую с Vulkan (Android), Metal (iOS) и Direct3D 12 (Windows), без прослойки OpenGL. Это даёт несколько преимуществ: более низкая задержка драйвера (до 50% меньше, чем через OpenGL), прямой контроль над памятью GPU и доступ к современным возможностям (тайловая архитектура GPU, GPU-driven rendering). OpenGL больше не развивается, и его драйверы на мобильных устройствах часто становятся узким местом производительности.
Impeller находится в активной разработке и доступен в каналах Flutter Master и Beta. Начиная с Flutter 3.16, Impeller включён по умолчанию на iOS, а на Android — опционально через флаг конфигурации. Полная замена Skia на Impeller ожидается в одном из стабильных релизов Flutter 2026 года.
На iOS Impeller работает через Metal и включён по умолчанию с Flutter 3.16. Команда Flutter рекомендует тестировать приложения на Impeller и сообщать о проблемах. Для отката на Skia используется флаг Impeller в файле Info.plist: FlutterEnableImpeller = NO. По данным Flutter Team, 92% приложений на iOS работают на Impeller без видимых регрессий, а производительность анимаций улучшается на 25–40%.
На Android Impeller работает через Vulkan. Для включения в AndroidManifest.xml добавляется мета-тег: io.flutter.embedded_views_preview. Команда Flutter продолжает оптимизацию Impeller под различные GPU-архитектуры (Adreno, Mali, PowerVR). Основная сложность на Android — поддержка устройств без Vulkan (Android < 7.0 или старые GPU). Для таких устройств будет использоваться падающий бэкенд на Skia или Impeller с программной растеризацией.
На Windows Impeller работает через Direct3D 12 (включён в Flutter Master). На macOS и Linux — через Metal и Vulkan соответственно. Для Web Impeller не планируется, так как веб-версия Flutter использует CanvasKit (Skia через WebAssembly), и для неё shader jank не является критической проблемой из-за другого механизма компиляции шейдеров в браузере. Веб-версия продолжит использовать Skia.
Google опубликовала дорожную карту Impeller: 2024 — Impeller по умолчанию на iOS; 2025 — Impeller по умолчанию на Android и Windows; 2026 — полное удаление Skia из Flutter Engine. После этого Flutter будет использовать Impeller как единственный рендеринговый движок, что упростит поддержку, уменьшит размер движка и улучшит производительность на всех платформах.
Часто задаваемые вопросы
На iOS Impeller включён по умолчанию с Flutter 3.16. На Android добавьте в AndroidManifest.xml мета-тег io.flutter.embedded_views_preview со значением true. На Windows используйте флаг --enable-impeller при запуске. Во всех случаях можно принудительно включить через FlutterEngine в Dart-коде.
Skia работает, но имеет фундаментальные проблемы: shader jank (50–200 мс задержки на компиляцию шейдеров), высокое потребление памяти и ограничения архитектуры OpenGL. Impeller спроектирован специально для Flutter и устраняет эти проблемы за счёт offline-компиляции шейдеров и пулов памяти.
Да, Impeller реализует тот же Canvas API, что и Skia. Все стандартные виджеты Flutter — текст, изображения, анимации, кастомные пайнты — работают на Impeller без изменений. Обратная совместимость обеспечивается на уровне Flutter Engine, и переход прозрачен для разработчика.
Нет, приложение использует один рендеринговый движок за раз. Выбор делается при инициализации Flutter Engine через флаг. Переключение между Skia и Impeller во время выполнения приложения невозможно — рендерер фиксируется до создания первого экземпляра FlutterEngine.
Skia продолжит существовать как самостоятельная библиотека Google для Chrome, Android и других проектов. В Flutter Skia будет заменена Impeller в качестве основного рендерера. Skia останется для Web-версии Flutter (через CanvasKit) и как запасной вариант для устройств без поддержки Vulkan/Metal.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.