Az Impeller egy modern renderelő motor a Flutter számára, amelyet a Google fejlesztett ki a Skia leváltására és alapvető problémáinak kiküszöbölésére: shader-késlekedések (jank) a képkockák első renderelésekor, magas memóriahasználat és a különböző grafikus backendek támogatásának nehézsége. A Skiától eltérően az Impeller előre (offline) fordítja le a shadereket, SPIR-V-t használ köztes reprezentációként, és közvetlenül a Vulkan, Metal és Direct3D 12 rendszerekkel működik. A Flutter Team (2025) adatai szerint az Impeller a shader-késlekedések 95%-át megszünteti, kiszámítható 60 FPS-t biztosítva még belépő szintű eszközökön is.
Főbb pontok
Impeller — egy nyílt forráskódú grafikus renderelő motor, C++ nyelven írva, amelyet a Flutter csapat fejleszt a Skia elsődleges renderelőként való leváltására. A projektet 2021-ben jelentették be válaszként a Skia-t sújtó évek óta tartó shader jank problémára. Az Impeller nem a Skia fork-ja — ez egy teljesen új implementáció, amely a mobil GPU-k korlátai és a modern grafikus API-k figyelembevételével készült.
Az Impeller fő ötlete a shader-fordítás áthelyezése az alkalmazás build fázisába, nem pedig futásidőbe. A Skiában a shaderek az első használatkor fordulnak le, amikor a felhasználó már interakcióba lép az alkalmazással. Impeller az összes shadert előre (offline) lefordítja, SPIR-V bináris formátumba csomagolja, és az alkalmazással együtt szállítja. Futásidőben az Impeller betölti az előre lefordított shadereket, ami kiküszöböli a fordítással járó késlekedéseket.
Az Impeller a memóriahasználat problémáját is megoldja. A Skia számos ideiglenes objektumot (textúrák, pufferek) hoz létre a renderelés során, ami memóriatöredezettséghez vezet a korlátozott erőforrású eszközökön. Impeller memóriapoolokat használ, és újra felhasználja a lefoglalt erőforrásokat, csökkentve a csúcsmemória-használatot 30–40%-kal.
SPIR-V (Standard Portable Intermediate Representation) — a Khronos Group által fejlesztett shader köztes reprezentáció. Az Impeller a SPIR-V-t használja univerzális formátumként az összes shader számára. A build fázisban az Impeller nyelvű (saját C++ DSL effektusok leírásához) shaderek SPIR-V-re fordulnak. Futásidőben a SPIR-V betöltődik és platform-specifikus formátumba fordítódik — MSL Metalhoz, GLSL a Vulkanhoz vagy DXIL a Direct3D 12-höz.
Az Impeller architektúrája több rétegből áll, amelyek mindegyike szigorúan meghatározott feladatot lát el: renderelési parancsok listájának feldolgozása, GPU erőforrások kezelése és shaderek végrehajtása. Ez a modularitás lehetővé teszi új grafikus API-k támogatásának egyszerű hozzáadását.
Az alsó réteg — egy absztrakció a grafikus API (Vulkan, Metal, Direct3D 12) felett. Az Impeller nem támogatja az OpenGL-t, mivel az OpenGL nem biztosít lehetőségeket a hatékony offline shader-fordításhoz. Ezen a szinten valósul meg: vertex pufferek kezelése, pipeline-ok (grafikus csővezetékek) létrehozása és gyorsítótárazása, GPU szinkronizáció. Pipeline az Impellerben — egy előre lefordított GPU állapot, amely magában foglalja a shadereket, raszterizációs és blending beállításokat. Az összes pipeline az inicializálási fázisban jön létre, ami kiküszöböli a fordítást renderelés közben.
A középső réteg — az erőforrás-kezelő rendszer. GPU erőforrásokat (textúrák, pufferek, samplerek) foglal le és használ fel újra. Ahelyett, hogy minden képkockánál új textúrát hozna létre, az Impeller különböző méretű és formátumú textúrák pool-ját tart fenn. A memóriapool automatikusan visszanyeri a nem használt erőforrásokat, és szükség esetén bővíthető, de a Skiára jellemző töredezettség nélkül.
A felső réteg — a renderelési gráf, amelybe a Flutter Engine a Canvas API parancsokat alakítja. Az Impeller fogadja a Display List-et (rajzolási parancsok listája), és abból függőségi gráfot épít. A gráf optimalizálásra kerül: a felesleges renderelési menetek eltávolításra kerülnek, az azonos GPU állapotú műveletek összevonásra kerülnek. Ezután a gráf lefordításra kerül Vulkan/Metal hívások sorozatává az előre létrehozott pipeline-ok segítségével.
Minden képkocka egy rögzített csővezetéken halad át: Display List → renderelési gráf → gráf fordítása → GPU parancsok küldése. További menetek adhatók hozzá utóhatásokhoz (elmosás, árnyékok) vagy a mélységi puffer előkészítéséhez. A képkockaidő az Impellerben kiszámíthatóbb, mint a Skiában, mivel nincsenek nem-determinisztikus késlekedések a shader-fordítás miatt.
Az Impeller és a Skia összehasonlítása különbségeket mutat a renderelési megközelítésben. A Skia — egy univerzális általános célú 2D könyvtár, míg az Impeller — egy specializált motor a Flutter számára, mobil UI igényekre optimalizálva.
| Paraméter | Skia | Impeller |
|---|---|---|
| Shaderek | Fordítás futásidőben | Offline fordítás (build idő) |
| Shader jank | 50–200 ms az első képkockánál | Nincs (0 ms) |
| Shader formátum | Saját (SkSL) | SPIR-V (univerzális) |
| GPU backendek | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| Memóriahasználat | Magas (ideiglenes textúrák) | Memóriapoolok, akár -40% |
| Platformok | Android, iOS, Web, Desktop | Android, iOS, Desktop |
| Státusz | Stabil (elsődleges) | Preview (leváltja a Skia-t) |
A legfőbb különbség — a shaderek megközelítése. A Skia a shadereket használatkor fordítja, shader jank-et okozva ismeretlen effektusok első renderelésekor. Az Impeller ezt offline fordítással küszöböli ki. A Skia támogatja az OpenGL-t is, ami szükséges a Flutter webes verziójához, de az Impeller lemond az OpenGL-ről a modernebb API-k javára, ami jobb teljesítményt nyújt mobileszközökön.
A Flutter alkalmazások számára az Impellerre való átállás nem igényel kódmódosítást. Az Impeller ugyanazt a Canvas API-t implementálja, mint a Skia, így minden widget, animáció és egyedi rajzolás ugyanúgy működik. A visszafelé kompatibilitás a Flutter Engine szintjén biztosított — a motor az alkalmazás inicializálási fázisában választja ki a renderelőt (Skia vagy Impeller).
Az Impeller számos mérhető előnyt kínál a Skiához képest, amelyek közvetlenül befolyásolják a felhasználói élményt és a Flutter alkalmazások teljesítményét.
Shader jank — a Skia fő problémája, amelyet az Impeller teljesen megold. Amikor egy Flutter alkalmazás új képernyőt jelenít meg gradiensekkel, maszkokkal vagy nem szabványos blendekkel, a Skia a shadereket az animáció során fordítja, ami képkockák kihagyásához vezet. Impeller az összes shadert a build fázisban fordítja le, így az első képkocka ugyanolyan gyorsan renderelődik, mint a következők. Lassú GPU-val rendelkező eszközökön (MediaTek Helio, Qualcomm 400 series) a különbség különösen szembetűnő — akár 200 ms késlekedés minden új effektustípusnál a Skiában, szemben a 0 ms-val az Impellerben.
Az Impeller erőforráspoolokat használ a GPU memória kezelésére. A Skiában minden képkocka új textúrákat hozhat létre ideiglenes felületekhez, különösen átlátszósággal történő rendereléskor vagy saveLayer használatakor. Az Impeller újra felhasználja a textúrákat a képkockák között, ami 30–40%-kal csökkenti a csúcsmemória-használatot Androidon és akár 25%-kal iOS-en. Ez különösen fontos a hosszú listákkal és animációkkal rendelkező alkalmazásoknál, ahol a Skia OOM hibákat okozhatott 2 GB RAM-mal rendelkező eszközökön.
A Skiában a képkocka renderelési ideje változhat attól függően, hogy mely shaderek vannak már lefordítva. Az első képkocka egy új effektussal 50–200 ms-ig tarthat, míg a következők 3–5 ms-ig. Ez a kiszámíthatatlanság megnehezíti az optimalizálást és tesztelést. Az Impeller egységes képkockaidőt biztosít, mivel az összes shader már le van fordítva, és a memóriaallokáció kiszámítható. A Flutter Engine az Impellerrel pontosabban tudja kalkulálni az időkeretet minden képkockához.
Az Impeller közvetlenül a Vulkan (Android), Metal (iOS) és Direct3D 12 (Windows) rendszerekkel működik, OpenGL réteg nélkül. Ez számos előnyt nyújt: alacsonyabb illesztőprogram-késlekedés (akár 50%-kal kevesebb, mint OpenGL-en keresztül), közvetlen vezérlés a GPU memória felett, és hozzáférés a modern képességekhez (tile-alapú GPU architektúra, GPU-driven rendering). Az OpenGL-t már nem fejlesztik, és illesztőprogramjai mobileszközökön gyakran teljesítménybeli szűk keresztmetszetté válnak.
Az Impeller aktív fejlesztés alatt áll, és elérhető a Flutter Master és Beta csatornákon. A Flutter 3.16-tól kezdve az Impeller alapértelmezetten be van kapcsolva iOS-en, Androidon pedig opcionálisan egy konfigurációs flag segítségével. A Skia teljes leváltása az Impellerre 2026 egyik stabil Flutter kiadásában várható.
iOS-en az Impeller a Metalon keresztül működik, és a Flutter 3.16 óta alapértelmezetten be van kapcsolva. A Flutter csapat javasolja az alkalmazások Impelleren való tesztelését és a problémák jelentését. A Skiára való visszaálláshoz az Impeller flag használható az Info.plist fájlban: FlutterEnableImpeller = NO. A Flutter Team adatai szerint az iOS alkalmazások 92%-a működik az Impelleren látható regresszió nélkül, és az animációk teljesítménye 25–40%-kal javul.
Androidon az Impeller a Vulkanon keresztül működik. Be kapcsolásához az AndroidManifest.xml fájlban meta-tag kerül hozzáadásra: io.flutter.embedded_views_preview. A Flutter csapat folytatja az Impeller optimalizálását különböző GPU architektúrákhoz (Adreno, Mali, PowerVR). A fő kihívás Androidon a Vulkan támogatás nélküli eszközök (Android < 7.0 vagy régi GPU-k) támogatása. Az ilyen eszközökhöz a Skia tartalék backend vagy szoftveres raszterizációval rendelkező Impeller kerül használatra.
Windows-on az Impeller a Direct3D 12-n keresztül működik (bekapcsolva a Flutter Masterben). macOS-en és Linux-on — Metalon és Vulkanon keresztül. Webhez az Impeller nem tervezett, mivel a Flutter webes verziója a CanvasKit-et (Skia WebAssembly-n keresztül) használja, és a shader jank nem kritikus probléma a böngészőben lévő eltérő shader-fordítási mechanizmus miatt. A webes verzió továbbra is a Skiát fogja használni.
A Google közzétette az Impeller ütemtervét: 2024 — Impeller alapértelmezett iOS-en; 2025 — Impeller alapértelmezett Androidon és Windows-on; 2026 — a Skia teljes eltávolítása a Flutter Engine-ből. Ezt követően a Flutter az Impeller-t használja egyetlen renderelő motorként, ami egyszerűsíti a támogatást, csökkenti a motor méretét és javítja a teljesítményt minden platformon.
Gyakran ismételt kérdések
iOS-en az Impeller alapértelmezetten be van kapcsolva a Flutter 3.16-tól. Androidon adja hozzá az AndroidManifest.xml fájlhoz a io.flutter.embedded_views_preview meta-tag-ot true értékkel. Windows-on használja a --enable-impeller flag-et indításkor. Minden esetben kényszeríthető a FlutterEngine-en keresztül Dart kódban.
A Skia működik, de alapvető problémái vannak: shader jank (50–200 ms késlekedés a shader-fordításnál), magas memóriahasználat és az OpenGL architektúra korlátai. Az Impeller kifejezetten a Flutter számára lett tervezve, és ezeket a problémákat a shaderek offline fordításával és memóriapoolokkal küszöböli ki.
Igen, az Impeller ugyanazt a Canvas API-t implementálja, mint a Skia. Az összes szabványos Flutter widget — szöveg, képek, animációk, egyedi paintek — változtatás nélkül működik az Impelleren. A visszafelé kompatibilitás a Flutter Engine szintjén biztosított, és az átállás átlátható a fejlesztő számára.
Nem, az alkalmazás egyszerre egy renderelő motort használ. A választás a Flutter Engine inicializálásakor történik egy flag segítségével. A Skia és Impeller közötti váltás az alkalmazás futása közben lehetetlen — a renderelő a FlutterEngine első példányának létrehozása előtt rögzítésre kerül.
A Skia továbbra is létezni fog a Google önálló könyvtáraként a Chrome, Android és más projektek számára. A Flutterben a Skiát az Impeller váltja le elsődleges renderelőként. A Skia megmarad a Flutter webes verziójához (CanvasKit-en keresztül) és tartalék opcióként a Vulkan/Metal támogatás nélküli eszközök számára.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.