Impeller: ключевые понятия, архитектура и преимущества

Автор: IT Sectr Опубликовано: 2026-06-04 Время чтения: 9 мин

Impeller — это современный движок рендеринга для Flutter, разработанный Google для замены Skia и устранения её фундаментальных проблем: шейдерных лагов (jank) при первой отрисовке кадров, высокого потребления памяти и сложности поддержки разных графических бэкендов. В отличие от Skia, Impeller компилирует шейдеры заранее (offline), использует SPIR-V как промежуточное представление и работает напрямую с Vulkan, Metal и Direct3D 12. По данным Flutter Team (2025), Impeller устраняет до 95% шейдерных лагов, обеспечивая предсказуемый 60 FPS даже на устройствах начального уровня.

Главное

  • Impeller — новый движок рендеринга Flutter, заменяющий Skia
  • Offline-компиляция шейдеров устраняет shader jank при первом рендеринге
  • Архитектура использует SPIR-V как универсальное промежуточное представление
  • Бэкенды Impeller работают напрямую с Vulkan, Metal и Direct3D 12
  • Производительность предсказуема за счёт предварительной обработки всех шейдеров

Что такое Impeller?

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 как основа

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?

Архитектура 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 с использованием предварительно созданных пайплайнов.

Поток выполнения кадра в Impeller

Каждый кадр проходит через фиксированный конвейер: Display List → рендеринговый граф → компиляция графа → отправка команд GPU. Дополнительные проходы могут добавляться для пост-эффектов (размытие, тени) или подготовки буфера глубины. Время кадра в Impeller более предсказуемо, чем в Skia, так как отсутствуют недетерминированные задержки на компиляцию шейдеров.

Impeller vs Skia: сравнение

Сравнение Impeller и Skia показывает различия в подходе к рендерингу. Skia — это универсальная 2D-библиотека общего назначения, а Impeller — специализированный движок для Flutter, оптимизированный под требования мобильного UI.

ПараметрSkiaImpeller
ШейдерыКомпиляция на лету (runtime)Offline-компиляция (build time)
Shader jank50–200 мс на первый кадрОтсутствует (0 мс)
Формат шейдеровСобственный (SkSL)SPIR-V (универсальный)
GPU бэкендыOpenGL, Vulkan, MetalVulkan, Metal, Direct3D 12
Потребление памятиВысокое (временные текстуры)Пулы памяти, до -40%
ПлатформыAndroid, iOS, Web, DesktopAndroid, iOS, Desktop
СтатусСтабильный (основной)Preview (замена Skia)

Ключевое различие — подход к шейдерам. Skia компилирует шейдеры в момент использования, создавая shader jank при первом рендеринге незнакомых эффектов. Impeller исключает это за счёт offline-компиляции. Также Skia поддерживает OpenGL, что необходимо для веб-версии Flutter, но Impeller отказывается от OpenGL в пользу более современных API, что даёт лучшую производительность на мобильных устройствах.

Совместимость с существующим кодом Flutter

Для приложений Flutter переход на Impeller не требует изменения кода. Impeller реализует тот же Canvas API, что и Skia, поэтому все виджеты, анимации и кастомные рисования работают одинаково. Обратная совместимость обеспечивается на уровне Flutter Engine — движок выбирает рендерер (Skia или Impeller) на этапе инициализации приложения.

Преимущества Impeller

Impeller даёт несколько измеримых преимуществ по сравнению со Skia, которые напрямую влияют на пользовательский опыт и производительность приложений Flutter.

Устранение shader jank

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 может точнее рассчитывать бюджет времени на каждый кадр.

Поддержка современных графических API

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 по умолчанию

На iOS Impeller работает через Metal и включён по умолчанию с Flutter 3.16. Команда Flutter рекомендует тестировать приложения на Impeller и сообщать о проблемах. Для отката на Skia используется флаг Impeller в файле Info.plist: FlutterEnableImpeller = NO. По данным Flutter Team, 92% приложений на iOS работают на Impeller без видимых регрессий, а производительность анимаций улучшается на 25–40%.

Android: опционально

На Android Impeller работает через Vulkan. Для включения в AndroidManifest.xml добавляется мета-тег: io.flutter.embedded_views_preview. Команда Flutter продолжает оптимизацию Impeller под различные GPU-архитектуры (Adreno, Mali, PowerVR). Основная сложность на Android — поддержка устройств без Vulkan (Android < 7.0 или старые GPU). Для таких устройств будет использоваться падающий бэкенд на Skia или Impeller с программной растеризацией.

Десктоп и Web

На 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 как единственный рендеринговый движок, что упростит поддержку, уменьшит размер движка и улучшит производительность на всех платформах.

Часто задаваемые вопросы

Как включить Impeller в Flutter?

На iOS Impeller включён по умолчанию с Flutter 3.16. На Android добавьте в AndroidManifest.xml мета-тег io.flutter.embedded_views_preview со значением true. На Windows используйте флаг --enable-impeller при запуске. Во всех случаях можно принудительно включить через FlutterEngine в Dart-коде.

Зачем заменять Skia, если она работает?

Skia работает, но имеет фундаментальные проблемы: shader jank (50–200 мс задержки на компиляцию шейдеров), высокое потребление памяти и ограничения архитектуры OpenGL. Impeller спроектирован специально для Flutter и устраняет эти проблемы за счёт offline-компиляции шейдеров и пулов памяти.

Поддерживает ли Impeller все виджеты Flutter?

Да, Impeller реализует тот же Canvas API, что и Skia. Все стандартные виджеты Flutter — текст, изображения, анимации, кастомные пайнты — работают на Impeller без изменений. Обратная совместимость обеспечивается на уровне Flutter Engine, и переход прозрачен для разработчика.

Можно ли использовать Skia и Impeller одновременно?

Нет, приложение использует один рендеринговый движок за раз. Выбор делается при инициализации Flutter Engine через флаг. Переключение между Skia и Impeller во время выполнения приложения невозможно — рендерер фиксируется до создания первого экземпляра FlutterEngine.

Что будет со Skia после внедрения Impeller?

Skia продолжит существовать как самостоятельная библиотека Google для Chrome, Android и других проектов. В Flutter Skia будет заменена Impeller в качестве основного рендерера. Skia останется для Web-версии Flutter (через CanvasKit) и как запасной вариант для устройств без поддержки Vulkan/Metal.

Итоги

  • Impeller — новый движок рендеринга Flutter, устраняющий shader jank через offline-компиляцию шейдеров
  • Архитектура основана на SPIR-V, предварительно скомпилированных пайплайнах и пулах памяти
  • Сравнение со Skia: отсутствие лагов при первом рендеринге, снижение памяти на 30–40%
  • Бэкенды поддерживают Vulkan, Metal и Direct3D 12 без устаревшего OpenGL
  • Статус на iOS — по умолчанию, на Android и Windows — опционально (Flutter 3.16+)
  • Совместимость полная: все существующие виджеты Flutter работают без изменений кода
  • Используйте Impeller в новых проектах Flutter и мигрируйте существующие для устранения лагов

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также