Impeller: nyckelbegrepp, arkitektur och fördelar

Författare: IT Sectr Publicerad: 2026-06-04 Lästid: 9 min

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 — den nya Flutter-renderingsmotorn som ersätter Skia
  • Offline-kompilering av shaders eliminerar shader jank vid första renderingen
  • Arkitekturen använder SPIR-V som universell mellanliggande representation
  • Backendar Impeller arbetar direkt med Vulkan, Metal och Direct3D 12
  • Prestanda är förutsägbar tack vare förbehandling av alla shaders

Vad är Impeller?

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 som grund

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.

Hur fungerar Impeller?

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.

Bildrutans exekveringsflöde i Impeller

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.

Impeller vs Skia: jämförelse

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.

ParameterSkiaImpeller
ShadersKompilering vid körningOffline-kompilering (byggtid)
Shader jank50–200 ms för första bildrutanSaknas (0 ms)
Shader-formatEget (SkSL)SPIR-V (universellt)
GPU-backendarOpenGL, Vulkan, MetalVulkan, Metal, Direct3D 12
MinnesförbrukningHög (tillfälliga texturer)Minnespooler, upp till -40 %
PlattformarAndroid, iOS, Web, DesktopAndroid, iOS, Desktop
StatusStabil (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.

Kompatibilitet med befintlig Flutter-kod

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.

Fördelar med Impeller

Impeller ger flera mätbara fördelar jämfört med Skia som direkt påverkar användarupplevelsen och prestandan hos Flutter-applikationer.

Eliminering av shader jank

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.

Minskad minnesförbrukning

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.

Förutsägbar prestanda

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.

Stöd för moderna grafiska API:er

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.

Nuvarande status och planer

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.

iOS: Impeller som standard

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 %.

Android: valfritt

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.

Desktop och Webb

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.

Färdplan

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

Hur aktiverar jag Impeller i Flutter?

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.

Varför ersätta Skia om det fungerar?

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.

Stöder Impeller alla Flutter-widgets?

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.

Kan Skia och Impeller användas samtidigt?

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.

Vad händer med Skia efter implementeringen av Impeller?

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

  • Impeller — ny Flutter-renderingsmotor som eliminerar shader jank genom offline-kompilering av shaders
  • Arkitekturen baserad på SPIR-V, förkompilerade pipelines och minnespooler
  • Jämförelse med Skia: inga fördröjningar vid första renderingen, minnesminskning 30–40 %
  • Backendar stöder Vulkan, Metal och Direct3D 12 utan föråldrat OpenGL
  • Status på iOS — standard, på Android och Windows — valfritt (Flutter 3.16+)
  • Kompatibilitet fullständig: alla befintliga Flutter-widgets fungerar utan kodändringar
  • Använd Impeller i nya Flutter-projekt och migrera befintliga för att eliminera fördröjningar

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.

Diskutera projektet

Läs också