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 залишиться для веб-версії 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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