Impeller: alapfogalmak, architektúra és előnyök

Szerző: IT Sectr Megjelenés: 2026-06-04 Olvasási idő: 9 perc

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 — a Skia-t leváltó új Flutter renderelő motor
  • Offline fordítás a shaderek megszünteti a shader jank-et az első renderelésnél
  • Architektúra SPIR-V-t használ univerzális köztes reprezentációként
  • Backendek közvetlenül Vulkan, Metal és Direct3D 12 rendszerekkel működnek
  • Teljesítmény kiszámítható az összes shader előzetes feldolgozásának köszönhetően

Mi az Impeller?

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 mint alap

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.

Hogyan működik az Impeller?

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.

A képkocka végrehajtásának folyamata az Impellerben

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.

Impeller vs Skia: összehasonlítás

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éterSkiaImpeller
ShaderekFordítás futásidőbenOffline fordítás (build idő)
Shader jank50–200 ms az első képkockánálNincs (0 ms)
Shader formátumSaját (SkSL)SPIR-V (univerzális)
GPU backendekOpenGL, Vulkan, MetalVulkan, Metal, Direct3D 12
MemóriahasználatMagas (ideiglenes textúrák)Memóriapoolok, akár -40%
PlatformokAndroid, iOS, Web, DesktopAndroid, iOS, Desktop
StátuszStabil (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.

Kompatibilitás a meglévő Flutter kóddal

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 előnyei

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.

A shader jank megszüntetése

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.

Memóriahasználat csökkentése

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.

Kiszámítható teljesítmény

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.

Modern grafikus API-k támogatása

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.

Jelenlegi állapot és tervek

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: Impeller alapértelmezett

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.

Android: opcionális

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.

Desktop és Web

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.

Ütemterv

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

Hogyan kapcsolhatom be az Impeller-t a Flutterben?

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.

Miért kell leváltani a Skiát, ha működik?

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.

Támogatja az Impeller az összes Flutter widgetet?

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.

Használható-e egyszerre a Skia és az Impeller?

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.

Mi lesz a Skiával az Impeller bevezetése után?

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

  • Impeller — új Flutter renderelő motor, amely a shader jank-et offline shader-fordítással szünteti meg
  • Architektúra SPIR-V-ra, előre lefordított pipeline-okra és memóriapoolokra épül
  • Összehasonlítás a Skiával: nincs késlekedés az első renderelésnél, memóriacsökkentés 30–40%
  • Backendek támogatják a Vulkan, Metal és Direct3D 12 rendszereket elavult OpenGL nélkül
  • Státusz iOS-en — alapértelmezett, Androidon és Windows-on — opcionális (Flutter 3.16+)
  • Kompatibilitás teljes: az összes meglévő Flutter widget kódváltoztatás nélkül működik
  • Használja az Impeller-t új Flutter projektekben és migrálja a meglévőket a késlekedések megszüntetéséhez

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.

Projekt megbeszélése

Olvassa el is