Impeller är en modern renderingsmotor för Flutter, utvecklad av Google för att ersätta Skia och åtgärda dess grundläggande problem: shader-fördröjningar (jank) vid första renderingen av bildrutor, hög minnesförbrukning och svårigheten att stödja olika grafiska backendar. Till skillnad från Skia kompilerar Impeller shaders i förväg (offline), använder SPIR-V som mellanliggande representation och arbetar direkt med Vulkan, Metal och Direct3D 12. Enligt uppgifter från Flutter Team (2025) eliminerar Impeller upp till 95 % av shader-fördröjningarna och ger förutsägbara 60 FPS även på nybörjarenheter.
Huvudpunkter
Impeller — är en grafisk renderingsmotor med öppen källkod, skriven i C++, som utvecklas av Flutter-teamet för att ersätta Skia som den primära renderaren. Projektet tillkännagavs 2021 som ett svar på det åratal av shader jank-problem som Skia lider av. Impeller är inte en fork av Skia — det är en helt ny implementering, designad med hänsyn till begränsningarna hos mobila GPU:er och moderna grafiska API:er.
Huvudidén med Impeller är att flytta kompileringen av shaders till applikationens byggfas, inte under körning. I Skia kompileras shaders vid första användningen, när användaren redan interagerar med applikationen. Impeller kompilerar alla shaders i förväg (offline), packar dem i SPIR-V binärformat och levererar dem tillsammans med applikationen. Under körning laddar Impeller de förkompilerade shaders, vilket eliminerar fördröjningar relaterade till kompilering.
Impeller löser också problemet med minnesförbrukning. Skia skapar många tillfälliga objekt (texturer, buffertar) under renderingsprocessen, vilket leder till minnesfragmentering på enheter med begränsade resurser. Impeller använder minnespooler och återanvänder allokerade resurser, vilket minskar toppminnesförbrukningen med 30–40 %.
SPIR-V (Standard Portable Intermediate Representation) — är en mellanliggande representation av shaders utvecklad av Khronos Group. Impeller använder SPIR-V som universellt format för alla shaders. I byggfasen kompileras shaders i Impeller-språket (egen C++ DSL för att beskriva effekter) till SPIR-V. Under körning laddas SPIR-V och översätts till plattformsspecifikt format — MSL för Metal, GLSL för Vulkan eller DXIL för Direct3D 12.
Impellers arkitektur består av flera lager, var och en utför en strikt definierad uppgift: bearbetning av renderingskommandolistan, hantering av GPU-resurser och exekvering av shaders. Denna modularitet gör det enkelt att lägga till stöd för nya grafiska API:er.
Det nedre lagret — är en abstraktion ovanpå det grafiska API:et (Vulkan, Metal, Direct3D 12). Impeller stöder inte OpenGL, eftersom OpenGL inte erbjuder möjligheter för effektiv offline-kompilering av shaders. På denna nivå implementeras: hantering av vertex-buffertar, skapande och cachning av pipelines (grafiska pipelines), GPU-synkronisering. Pipeline i Impeller — är ett förkompilerat GPU-tillstånd som inkluderar shaders, rasteriserings- och blending-inställningar. Alla pipelines skapas under initialiseringsfasen, vilket eliminerar kompilering under rendering.
Det mellersta lagret — är resurshanteringssystemet. Det allokerar och återanvänder GPU-resurser: texturer, buffertar, samplers. Istället för att skapa en ny textur vid varje bildruta, underhåller Impeller en pool av texturer i olika storlekar och format. Minnespoolen returnerar automatiskt oanvända resurser och kan expanderas vid behov, men utan den fragmentering som är karakteristisk för Skia.
Det övre lagret — är renderingsgrafen där Flutter Engine omvandlar Canvas API-kommandon. Impeller tar emot en Display List (lista med ritkommandon) och bygger en beroendegraf av operationer. Grafen optimeras: onödiga renderingspassage tas bort, operationer med samma GPU-tillstånd slås samman. Därefter kompileras grafen till en sekvens av Vulkan/Metal-anrop med hjälp av förskapade pipelines.
Varje bildruta passerar genom en fast pipeline: Display List → renderingsgraf → kompilering av graf → sändning av GPU-kommandon. Ytterligare passage kan läggas till för post-effekter (oskärpa, skuggor) eller förberedelse av djupbuffert. Bildrutetiden i Impeller är mer förutsägbar än i Skia, eftersom det inte finns några icke-deterministiska fördröjningar för shader-kompilering.
Jämförelsen mellan Impeller och Skia visar skillnader i synsätt på rendering. Skia — är ett universellt 2D-bibliotek för allmänt bruk, medan Impeller — är en specialiserad motor för Flutter, optimerad för mobila UI-krav.
| Parameter | Skia | Impeller |
|---|---|---|
| Shaders | Kompilering vid körning | Offline-kompilering (byggtid) |
| Shader jank | 50–200 ms för första bildrutan | Saknas (0 ms) |
| Shader-format | Eget (SkSL) | SPIR-V (universellt) |
| GPU-backendar | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| Minnesförbrukning | Hög (tillfälliga texturer) | Minnespooler, upp till -40 % |
| Plattformar | Android, iOS, Web, Desktop | Android, iOS, Desktop |
| Status | Stabil (primär) | Preview (ersätter Skia) |
Den viktigaste skillnaden — synsättet på shaders. Skia kompilerar shaders vid användningstillfället, vilket skapar shader jank vid första renderingen av okända effekter. Impeller eliminerar detta genom offline-kompilering. Skia stöder också OpenGL, vilket är nödvändigt för webbversionen av Flutter, men Impeller avstår från OpenGL till förmån för modernare API:er, vilket ger bättre prestanda på mobila enheter.
För Flutter-applikationer kräver övergången till Impeller inga kodändringar. Impeller implementerar samma Canvas API som Skia, så alla widgets, animationer och anpassade ritningar fungerar på samma sätt. Bakåtkompatibilitet garanteras på Flutter Engine-nivå — motorn väljer renderare (Skia eller Impeller) i applikationens initialiseringsfas.
Impeller ger flera mätbara fördelar jämfört med Skia som direkt påverkar användarupplevelsen och prestandan hos Flutter-applikationer.
Shader jank — det främsta problemet med Skia som Impeller löser helt. När en Flutter-applikation visar en ny skärm med gradienter, masker eller icke-standardiserade blends, kompilerar Skia shaders under animationen, vilket leder till överhoppade bildrutor. Impeller kompilerar alla shaders i byggfasen, så den första bildrutan renderas lika snabbt som efterföljande. På enheter med långsam GPU (MediaTek Helio, Qualcomm 400 series) är skillnaden särskilt märkbar — upp till 200 ms fördröjning för varje ny effekttyp i Skia jämfört med 0 ms i Impeller.
Impeller använder resurspooler för hantering av GPU-minne. I Skia kan varje bildruta skapa nya texturer för tillfälliga ytor, särskilt vid rendering med transparens eller användning av saveLayer. Impeller återanvänder texturer mellan bildrutor, vilket minskar toppminnesförbrukningen med 30–40 % på Android och upp till 25 % på iOS. Detta är särskilt viktigt för applikationer med långa listor och animationer, där Skia kunde orsaka OOM-fel på enheter med 2 GB RAM.
I Skia kan bildrutans renderingstid variera beroende på vilka shaders som redan är kompilerade. Den första bildrutan med en ny effekt kan ta 50–200 ms, medan efterföljande — 3–5 ms. Denna oförutsägbarhet försvårar optimering och testning. Impeller säkerställer enhetlig bildrutetid eftersom alla shaders redan är kompilerade och minnesallokeringen är förutsägbar. Flutter Engine med Impeller kan mer exakt beräkna tidsbudgeten för varje bildruta.
Impeller arbetar direkt med Vulkan (Android), Metal (iOS) och Direct3D 12 (Windows), utan OpenGL-lager. Detta ger flera fördelar: lägre drivrutinsfördröjning (upp till 50 % mindre än genom OpenGL), direkt kontroll över GPU-minne och tillgång till moderna funktioner (tile-baserad GPU-arkitektur, GPU-driven rendering). OpenGL utvecklas inte längre och dess drivrutiner på mobila enheter blir ofta en prestandaflaskhals.
Impeller är under aktiv utveckling och finns tillgängligt i Flutter Master- och Beta-kanalerna. Från och med Flutter 3.16 är Impeller aktiverat som standard på iOS, och på Android — valfritt via en konfigurationsflagga. Fullständigt ersättande av Skia med Impeller förväntas i en av de stabila Flutter-utgåvorna 2026.
På iOS fungerar Impeller via Metal och är aktiverat som standard sedan Flutter 3.16. Flutter-teamet rekommenderar att testa applikationer på Impeller och rapportera problem. För att återgå till Skia används Impeller-flaggan i Info.plist-filen: FlutterEnableImpeller = NO. Enligt uppgifter från Flutter Team fungerar 92 % av applikationerna på iOS på Impeller utan synliga regressioner och animationsprestandan förbättras med 25–40 %.
På Android fungerar Impeller via Vulkan. För att aktivera läggs en meta-tagg till i AndroidManifest.xml: io.flutter.embedded_views_preview. Flutter-teamet fortsätter att optimera Impeller för olika GPU-arkitekturer (Adreno, Mali, PowerVR). Den största utmaningen på Android är stöd för enheter utan Vulkan (Android < 7.0 eller gamla GPU:er). För sådana enheter kommer en reserv-backend på Skia eller Impeller med mjukvarurastrering att användas.
På Windows fungerar Impeller via Direct3D 12 (aktiverat i Flutter Master). På macOS och Linux — via Metal respektive Vulkan. För Webb är Impeller inte planerat, eftersom webbversionen av Flutter använder CanvasKit (Skia via WebAssembly) och shader jank är inte ett kritiskt problem på grund av den annorlunda shader-kompileringsmekanismen i webbläsaren. Webbversionen kommer att fortsätta använda Skia.
Google har publicerat färdplanen för Impeller: 2024 — Impeller som standard på iOS; 2025 — Impeller som standard på Android och Windows; 2026 — fullständigt borttagande av Skia från Flutter Engine. Därefter kommer Flutter att använda Impeller som den enda renderingsmotorn, vilket kommer att förenkla supporten, minska motorns storlek och förbättra prestandan på alla plattformar.
Vanliga frågor
På iOS är Impeller aktiverat som standard sedan Flutter 3.16. På Android lägger du till meta-taggen io.flutter.embedded_views_preview med värdet true i AndroidManifest.xml. På Windows använder du flaggan --enable-impeller vid start. I samtliga fall kan det framtvingas via FlutterEngine i Dart-kod.
Skia fungerar, men har grundläggande problem: shader jank (50–200 ms fördröjning för shader-kompilering), hög minnesförbrukning och begränsningar i OpenGL-arkitekturen. Impeller är designat specifikt för Flutter och eliminerar dessa problem genom offline-kompilering av shaders och minnespooler.
Ja, Impeller implementerar samma Canvas API som Skia. Alla standard Flutter-widgets — text, bilder, animationer, anpassade paints — fungerar på Impeller utan ändringar. Bakåtkompatibilitet garanteras på Flutter Engine-nivå och övergången är transparent för utvecklaren.
Nej, applikationen använder en renderingsmotor i taget. Valet görs vid initialisering av Flutter Engine via en flagga. Växling mellan Skia och Impeller under applikationens körning är omöjlig — renderaren fastställs innan den första instansen av FlutterEngine skapas.
Skia kommer att fortsätta att existera som ett oberoende Google-bibliotek för Chrome, Android och andra projekt. I Flutter kommer Skia att ersättas av Impeller som primär renderare. Skia kommer att finnas kvar för webbversionen av Flutter (via CanvasKit) och som reservalternativ för enheter utan Vulkan/Metal-stöd.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.