Impeller je moderní renderovací engine pro Flutter, vyvinutý společností Google k nahrazení Skia a odstranění jejích zásadních problémů: zpoždění shaderů (jank) při prvním vykreslování snímků, vysoké spotřeby paměti a obtížnosti podpory různých grafických backendů. Na rozdíl od Skia Impeller překládá shadery předem (offline), používá SPIR-V jako zprostředkující reprezentaci a pracuje přímo s Vulkan, Metal a Direct3D 12. Podle údajů Flutter Team (2025) odstraňuje Impeller až 95 % zpoždění shaderů a zajišťuje předvídatelných 60 FPS i na zařízeních základní úrovně.
Hlavní body
Impeller — je grafický renderovací engine s otevřeným zdrojovým kódem, napsaný v C++, který je vyvíjen týmem Flutter k nahrazení Skia jako hlavního rendereru. Projekt byl oznámen v roce 2021 jako odpověď na dlouholetý problém shader jank, kterým Skia trpí. Impeller není fork Skia — je to zcela nová implementace navržená s ohledem na omezení mobilních GPU a moderních grafických API.
Hlavní myšlenkou Impeller je přesun překladu shaderů do fáze sestavení (build) aplikace, nikoli za běhu. V Skia se shadery překládají při prvním použití, když uživatel již s aplikací interaguje. Impeller překládá všechny shadery předem (offline), balí je do binárního formátu SPIR-V a dodává je spolu s aplikací. Za běhu Impeller načítá předem přeložené shadery, což eliminuje zpoždění spojená s překladem.
Impeller také řeší problém spotřeby paměti. Skia vytváří četné dočasné objekty (textury, buffery) během procesu vykreslování, což vede k fragmentaci paměti na zařízeních s omezenými prostředky. Impeller používá paměťové fondy (memory pools) a znovu využívá přidělené prostředky, čímž snižuje špičkovou spotřebu paměti o 30–40 %.
SPIR-V (Standard Portable Intermediate Representation) — je zprostředkující reprezentace shaderů vyvinutá Khronos Group. Impeller používá SPIR-V jako univerzální formát pro všechny shadery. Ve fázi sestavení jsou shadery v jazyce Impeller (vlastní C++ DSL pro popis efektů) překládány do SPIR-V. Za běhu je SPIR-V načten a přeložen do formátu specifického pro platformu — MSL pro Metal, GLSL pro Vulkan nebo DXIL pro Direct3D 12.
Architektura Impeller se skládá z několika vrstev, z nichž každá plní přesně definovaný úkol: zpracování seznamu příkazů pro vykreslování, správa prostředků GPU a provádění shaderů. Tato modularita umožňuje snadné přidávání podpory pro nová grafická API.
Spodní vrstva — je abstrakce nad grafickým API (Vulkan, Metal, Direct3D 12). Impeller nepodporuje OpenGL, protože OpenGL neposkytuje možnosti pro efektivní offline překlad shaderů. Na této úrovni jsou implementovány: správa vertex bufferů, vytváření a ukládání do mezipaměti pipeline (grafických potrubí), synchronizace GPU. Pipeline v Impeller — je předem přeložený stav GPU, který zahrnuje shadery, nastavení rasterizace a blendingu. Všechny pipeline jsou vytvářeny ve fázi inicializace, což eliminuje překlad během vykreslování.
Střední vrstva — je systém správy prostředků. Přiděluje a znovu využívá GPU prostředky: textury, buffery, samplery. Místo vytváření nové textury při každém snímku Impeller udržuje fond textur různých velikostí a formátů. Paměťový fond automaticky vrací nepoužívané prostředky a může se v případě potřeby rozšířit, ale bez fragmentace charakteristické pro Skia.
Horní vrstva — je vykreslovací graf, do kterého Flutter Engine převádí příkazy Canvas API. Impeller přijímá Display List (seznam příkazů kreslení) a vytváří z něj graf závislostí operací. Graf je optimalizován: jsou odstraněny zbytečné průchody vykreslováním, jsou sloučeny operace se stejným stavem GPU. Poté je graf přeložen do sekvence volání Vulkan/Metal s použitím předem vytvořených pipeline.
Každý snímek prochází pevným potrubím: Display List → vykreslovací graf → překlad grafu → odeslání příkazů GPU. Další průchody mohou být přidány pro post-efekty (rozostření, stíny) nebo přípravu hloubkového bufferu. Čas snímku je v Impeller předvídatelnější než v Skia, protože neexistují nedeterministická zpoždění pro překlad shaderů.
Srovnání Impeller a Skia ukazuje rozdíly v přístupu k vykreslování. Skia — je univerzální 2D knihovna pro všeobecné použití, zatímco Impeller — je specializovaný engine pro Flutter, optimalizovaný pro potřeby mobilního UI.
| Parametr | Skia | Impeller |
|---|---|---|
| Shadery | Překlad za běhu (runtime) | Offline překlad (build time) |
| Shader jank | 50–200 ms pro první snímek | Chybí (0 ms) |
| Formát shaderů | Vlastní (SkSL) | SPIR-V (univerzální) |
| GPU backendy | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| Spotřeba paměti | Vysoká (dočasné textury) | Paměťové fondy, až -40 % |
| Platformy | Android, iOS, Web, Desktop | Android, iOS, Desktop |
| Stav | Stabilní (hlavní) | Preview (nahrazuje Skia) |
Klíčový rozdíl — přístup k shaderům. Skia překládá shadery v okamžiku použití, čímž vytváří shader jank při prvním vykreslení neznámých efektů. Impeller to eliminuje díky offline překladu. Skia také podporuje OpenGL, což je nezbytné pro webovou verzi Flutter, ale Impeller od OpenGL upouští ve prospěch modernějších API, což poskytuje lepší výkon na mobilních zařízeních.
Pro aplikace Flutter přechod na Impeller nevyžaduje změny kódu. Impeller implementuje stejné Canvas API jako Skia, takže všechny widgety, animace a vlastní kreslení fungují stejně. Zpětná kompatibilita je zajištěna na úrovni Flutter Engine — engine si vybírá renderer (Skia nebo Impeller) ve fázi inicializace aplikace.
Impeller poskytuje několik měřitelných výhod oproti Skia, které přímo ovlivňují uživatelský zážitek a výkon aplikací Flutter.
Shader jank — hlavní problém Skia, který Impeller zcela řeší. Když aplikace Flutter zobrazuje novou obrazovku s gradienty, maskami nebo nestandardními bledy, Skia překládá shadery během animace, což vede k přeskakování snímků. Impeller překládá všechny shadery ve fázi sestavení, takže první snímek se vykresluje stejně rychle jako následující. Na zařízeních s pomalým GPU (MediaTek Helio, Qualcomm 400 series) je rozdíl obzvláště patrný — až 200 ms zpoždění pro každý nový typ efektu v Skia oproti 0 ms v Impeller.
Impeller používá fondy prostředků pro správu GPU paměti. V Skia může každý snímek vytvářet nové textury pro dočasné plochy, zejména při vykreslování s průhledností nebo použití saveLayer. Impeller znovu využívá textury mezi snímky, což snižuje špičkovou spotřebu paměti o 30–40 % na Androidu a až o 25 % na iOS. To je důležité zejména pro aplikace s dlouhými seznamy a animacemi, kde Skia mohla způsobovat chyby OOM na zařízeních s 2 GB RAM.
V Skia se doba vykreslování snímku může lišit v závislosti na tom, které shadery jsou již přeloženy. První snímek s novým efektem může trvat 50–200 ms, zatímco následující — 3–5 ms. Tato nepředvídatelnost ztěžuje optimalizaci a testování. Impeller zajišťuje rovnoměrnou dobu snímku, protože všechny shadery jsou již přeloženy a alokace paměti je předvídatelná. Flutter Engine s Impeller může přesněji vypočítat časový rozpočet pro každý snímek.
Impeller pracuje přímo s Vulkan (Android), Metal (iOS) a Direct3D 12 (Windows), bez vrstvy OpenGL. To poskytuje několik výhod: nižší latenci ovladače (až o 50 % méně než přes OpenGL), přímou kontrolu nad GPU pamětí a přístup k moderním schopnostem (tile-based GPU architektura, GPU-driven rendering). OpenGL se již nevyvíjí a jeho ovladače na mobilních zařízeních se často stávají úzkým hrdlem výkonu.
Impeller je v aktivním vývoji a je dostupný v kanálech Flutter Master a Beta. Od Flutter 3.16 je Impeller ve výchozím nastavení zapnutý na iOS a na Androidu — volitelně pomocí konfiguračního přepínače. Úplné nahrazení Skia Impeller se očekává v jedné ze stabilních verzí Flutter v roce 2026.
Na iOS Impeller funguje přes Metal a je ve výchozím nastavení zapnutý od Flutter 3.16. Tým Flutter doporučuje testovat aplikace na Impeller a hlásit problémy. Pro návrat k Skia se používá přepínač Impeller v souboru Info.plist: FlutterEnableImpeller = NO. Podle údajů Flutter Team 92 % aplikací na iOS funguje na Impeller bez viditelných regresí a výkon animací se zlepšuje o 25–40 %.
Na Androidu Impeller funguje přes Vulkan. Pro zapnutí se do AndroidManifest.xml přidá meta-tag: io.flutter.embedded_views_preview. Tým Flutter pokračuje v optimalizaci Impeller pro různé GPU architektury (Adreno, Mali, PowerVR). Hlavní výzvou na Androidu je podpora zařízení bez Vulkan (Android < 7.0 nebo staré GPU). Pro tato zařízení bude použit záložní backend na Skia nebo Impeller s softwarovou rasterizací.
Na Windows Impeller funguje přes Direct3D 12 (zapnuto ve Flutter Master). Na macOS a Linux — přes Metal a Vulkan. Pro Web není Impeller plánován, protože webová verze Flutter používá CanvasKit (Skia přes WebAssembly) a shader jank není kritickým problémem kvůli odlišnému mechanismu překladu shaderů v prohlížeči. Webová verze bude nadále používat Skia.
Google zveřejnil plán Impeller: 2024 — Impeller ve výchozím nastavení na iOS; 2025 — Impeller ve výchozím nastavení na Androidu a Windows; 2026 — úplné odstranění Skia z Flutter Engine. Poté bude Flutter používat Impeller jako jediný renderovací engine, což zjednoduší podporu, zmenší velikost enginu a zlepší výkon na všech platformách.
Často kladené otázky
Na iOS je Impeller ve výchozím nastavení zapnutý od Flutter 3.16. Na Androidu přidejte do AndroidManifest.xml meta-tag io.flutter.embedded_views_preview s hodnotou true. Na Windows použijte přepínač --enable-impeller při spuštění. Ve všech případech lze vynutit přes FlutterEngine v Dart kódu.
Skia funguje, ale má zásadní problémy: shader jank (50–200 ms zpoždění pro překlad shaderů), vysokou spotřebu paměti a omezení architektury OpenGL. Impeller je navržen speciálně pro Flutter a tyto problémy odstraňuje díky offline překladu shaderů a paměťovým fondům.
Ano, Impeller implementuje stejné Canvas API jako Skia. Všechny standardní widgety Flutter — text, obrázky, animace, vlastní malby — fungují na Impeller beze změn. Zpětná kompatibilita je zajištěna na úrovni Flutter Engine a přechod je pro vývojáře transparentní.
Ne, aplikace používá vždy jeden renderovací engine. Výběr se provádí při inicializaci Flutter Engine pomocí přepínače. Přepínání mezi Skia a Impeller za běhu aplikace není možné — renderer je stanoven před vytvořením první instance FlutterEngine.
Skia bude nadále existovat jako samostatná knihovna Google pro Chrome, Android a další projekty. Ve Flutter bude Skia nahrazena Impeller jako hlavní renderer. Skia zůstane pro webovou verzi Flutter (přes CanvasKit) a jako záložní možnost pro zařízení bez podpory Vulkan/Metal.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.