Impeller: kernconcepten, architectuur en voordelen

Auteur: IT Sectr Gepubliceerd: 2026-06-04 Leestijd: 9 min

Impeller is een moderne rendering-engine voor Flutter, ontwikkeld door Google om Skia te vervangen en de fundamentele problemen ervan op te lossen: shader-vertragingen (jank) bij de eerste weergave van frames, hoog geheugengebruik en de moeilijkheid om verschillende grafische back-ends te ondersteunen. In tegenstelling tot Skia compileert Impeller shaders vooraf (offline), gebruikt SPIR-V als tussenliggende representatie en werkt rechtstreeks met Vulkan, Metal en Direct3D 12. Volgens gegevens van Flutter Team (2025) elimineert Impeller tot 95% van de shader-vertragingen en zorgt voor voorspelbare 60 FPS, zelfs op instapniveau-apparaten.

Belangrijkste punten

  • Impeller — de nieuwe Flutter rendering-engine die Skia vervangt
  • Offline-compilatie van shaders elimineert shader jank bij de eerste weergave
  • Architectuur gebruikt SPIR-V als universele tussenliggende representatie
  • Back-ends van Impeller werken rechtstreeks met Vulkan, Metal en Direct3D 12
  • Prestaties zijn voorspelbaar dankzij voorafgaande verwerking van alle shaders

Wat is Impeller?

Impeller — is een grafische rendering-engine met open source, geschreven in C++, die door het Flutter-team wordt ontwikkeld om Skia te vervangen als de primaire renderer. Het project werd in 2021 aangekondigd als antwoord op het jarenlange shader jank-probleem waar Skia aan lijdt. Impeller is geen fork van Skia — het is een volledig nieuwe implementatie, ontworpen met het oog op de beperkingen van mobiele GPU's en moderne grafische API's.

Het belangrijkste idee van Impeller is het verplaatsen van shader-compilatie naar de build-fase van de applicatie, in plaats van tijdens runtime. In Skia worden shaders gecompileerd bij het eerste gebruik, wanneer de gebruiker al interactie heeft met de applicatie. Impeller compileert alle shaders vooraf (offline), verpakt ze in het binaire SPIR-V-formaat en levert ze mee met de applicatie. Tijdens runtime laadt Impeller de vooraf gecompileerde shaders, wat vertragingen door compilatie elimineert.

Impeller lost ook het geheugengebruiksprobleem op. Skia creëert talloze tijdelijke objecten (texturen, buffers) tijdens het renderen, wat leidt tot geheugenfragmentatie op apparaten met beperkte bronnen. Impeller gebruikt geheugenpools en hergebruikt toegewezen bronnen, waardoor het piekgeheugengebruik met 30–40% afneemt.

SPIR-V als basis

SPIR-V (Standard Portable Intermediate Representation) — is een tussenliggende weergave van shaders, ontwikkeld door de Khronos Group. Impeller gebruikt SPIR-V als universeel formaat voor alle shaders. In de build-fase worden shaders in de Impeller-taal (een eigen C++ DSL voor het beschrijven van effecten) gecompileerd naar SPIR-V. Tijdens runtime wordt SPIR-V geladen en vertaald naar het platformspecifieke formaat — MSL voor Metal, GLSL voor Vulkan of DXIL voor Direct3D 12.

Hoe werkt Impeller?

De architectuur van Impeller bestaat uit verschillende lagen, elk met een strikt gedefinieerde taak: verwerking van de rendering-commando's, beheer van GPU-bronnen en uitvoering van shaders. Deze modulariteit maakt het eenvoudig om ondersteuning voor nieuwe grafische API's toe te voegen.

De onderste laag — is een abstractie boven de grafische API (Vulkan, Metal, Direct3D 12). Impeller ondersteunt OpenGL niet, omdat OpenGL geen mogelijkheden biedt voor efficiënte offline shader-compilatie. Op dit niveau zijn geïmplementeerd: beheer van vertex-buffers, aanmaken en cachen van pipelines (grafische pijplijnen), GPU-synchronisatie. Pipeline in Impeller — is een vooraf gecompileerde GPU-status die shaders, rasterisatie- en blending-instellingen omvat. Alle pipelines worden aangemaakt in de initialisatiefase, wat compilatie tijdens het renderen elimineert.

De middelste laag — is het bronnenbeheersysteem. Het wijst GPU-bronnen toe en hergebruikt ze: texturen, buffers, samplers. In plaats van bij elk frame een nieuwe textuur te maken, onderhoudt Impeller een pool van texturen in verschillende formaten en afmetingen. De geheugenpool retourneert automatisch ongebruikte bronnen en kan indien nodig worden uitgebreid, maar zonder de fragmentatie die kenmerkend is voor Skia.

De bovenste laag — is de rendering-graaf waarin Flutter Engine de Canvas API-commando's omzet. Impeller ontvangt een Display List (lijst met tekenopdrachten) en bouwt daaruit een afhankelijkheidsgraaf van bewerkingen. De graaf wordt geoptimaliseerd: overbodige rendering-passages worden verwijderd, bewerkingen met dezelfde GPU-status worden samengevoegd. Vervolgens wordt de graaf gecompileerd naar een reeks Vulkan/Metal-aanroepen met behulp van vooraf aangemaakte pipelines.

Frame-uitvoeringsstroom in Impeller

Elk frame doorloopt een vaste pijplijn: Display List → rendering-graaf → compilatie van de graaf → verzenden van GPU-commando's. Extra passages kunnen worden toegevoegd voor post-effecten (vervaging, schaduwen) of het voorbereiden van de dieptebuffer. Frame-tijd is in Impeller voorspelbaarder dan in Skia, omdat er geen niet-deterministische vertragingen zijn voor shader-compilatie.

Impeller vs Skia: vergelijking

De vergelijking tussen Impeller en Skia toont verschillen in de benadering van rendering. Skia — is een universele 2D-bibliotheek voor algemeen gebruik, terwijl Impeller — een gespecialiseerde engine is voor Flutter, geoptimaliseerd voor de eisen van mobiele UI.

ParameterSkiaImpeller
ShadersRuntime-compilatieOffline-compilatie (build time)
Shader jank50–200 ms voor het eerste frameAfwezig (0 ms)
Shader-formaatEigen (SkSL)SPIR-V (universeel)
GPU back-endsOpenGL, Vulkan, MetalVulkan, Metal, Direct3D 12
GeheugengebruikHoog (tijdelijke texturen)Geheugenpools, tot -40%
PlatformsAndroid, iOS, Web, DesktopAndroid, iOS, Desktop
StatusStabiel (primair)Preview (vervangt Skia)

Het belangrijkste verschil — de benadering van shaders. Skia compileert shaders op het moment van gebruik, wat shader jank veroorzaakt bij de eerste weergave van onbekende effecten. Impeller elimineert dit door offline-compilatie. Ook ondersteunt Skia OpenGL, wat nodig is voor de webversie van Flutter, maar Impeller laat OpenGL vallen ten gunste van modernere API's, wat betere prestaties op mobiele apparaten oplevert.

Compatibiliteit met bestaande Flutter-code

Voor Flutter-applicaties vereist de overstap naar Impeller geen codewijzigingen. Impeller implementeert dezelfde Canvas API als Skia, dus alle widgets, animaties en aangepaste tekeningen werken hetzelfde. Backward-compatibiliteit wordt gegarandeerd op het niveau van Flutter Engine — de engine kiest de renderer (Skia of Impeller) in de initialisatiefase van de applicatie.

Voordelen van Impeller

Impeller biedt verschillende meetbare voordelen ten opzichte van Skia die direct van invloed zijn op de gebruikerservaring en prestaties van Flutter-applicaties.

Eliminatie van shader jank

Shader jank — het belangrijkste probleem van Skia dat Impeller volledig oplost. Wanneer een Flutter-applicatie een nieuw scherm toont met gradiënten, maskers of niet-standaard blends, compileert Skia shaders tijdens de animatie, wat leidt tot overgeslagen frames. Impeller compileert alle shaders in de build-fase, dus het eerste frame wordt net zo snel weergegeven als de volgende. Op apparaten met een trage GPU (MediaTek Helio, Qualcomm 400 series) is het verschil bijzonder merkbaar — tot 200 ms vertraging voor elk nieuw effecttype in Skia versus 0 ms in Impeller.

Vermindering van geheugengebruik

Impeller gebruikt resource-pools voor het beheer van GPU-geheugen. In Skia kan elk frame nieuwe texturen maken voor tijdelijke oppervlakken, vooral bij rendering met transparantie of het gebruik van saveLayer. Impeller hergebruikt texturen tussen frames, wat het piekgeheugengebruik met 30–40% op Android en tot 25% op iOS vermindert. Dit is vooral belangrijk voor applicaties met lange lijsten en animaties, waar Skia OOM-fouten kon veroorzaken op apparaten met 2 GB RAM.

Voorspelbare prestaties

In Skia kan de frame-renderingtijd variëren afhankelijk van welke shaders al zijn gecompileerd. Het eerste frame met een nieuw effect kan 50–200 ms duren, terwijl volgende frames 3–5 ms duren. Deze onvoorspelbaarheid bemoeilijkt optimalisatie en testen. Impeller zorgt voor een uniforme frame-tijd, omdat alle shaders al zijn gecompileerd en de geheugentoewijzing voorspelbaar is. Flutter Engine met Impeller kan het tijdbudget voor elk frame nauwkeuriger berekenen.

Ondersteuning voor moderne grafische API's

Impeller werkt rechtstreeks met Vulkan (Android), Metal (iOS) en Direct3D 12 (Windows), zonder de OpenGL-laag. Dit biedt verschillende voordelen: lagere driver-latentie (tot 50% minder dan via OpenGL), directe controle over GPU-geheugen en toegang tot moderne mogelijkheden (tile-based GPU-architectuur, GPU-driven rendering). OpenGL wordt niet meer ontwikkeld en de drivers op mobiele apparaten worden vaak een prestatieknelpunt.

Huidige status en plannen

Impeller is in actieve ontwikkeling en beschikbaar in de Flutter Master- en Beta-kanalen. Sinds Flutter 3.16 is Impeller standaard ingeschakeld op iOS, en op Android — optioneel via een configuratievlag. De volledige vervanging van Skia door Impeller wordt verwacht in een van de stabiele Flutter-releases in 2026.

iOS: Impeller standaard

Op iOS werkt Impeller via Metal en is standaard ingeschakeld sinds Flutter 3.16. Het Flutter-team raadt aan om applicaties op Impeller te testen en problemen te melden. Voor terugkeer naar Skia wordt de Impeller-vlag in Info.plist gebruikt: FlutterEnableImpeller = NO. Volgens gegevens van het Flutter Team werkt 92% van de iOS-applicaties op Impeller zonder zichtbare regressies, en de animatieprestaties verbeteren met 25–40%.

Android: optioneel

Op Android werkt Impeller via Vulkan. Om het in te schakelen, wordt in AndroidManifest.xml een meta-tag toegevoegd: io.flutter.embedded_views_preview. Het Flutter-team blijft Impeller optimaliseren voor verschillende GPU-architecturen (Adreno, Mali, PowerVR). De grootste uitdaging op Android is de ondersteuning voor apparaten zonder Vulkan (Android < 7.0 of oude GPU's). Voor dergelijke apparaten wordt een fallback-backend op Skia of Impeller met software-rasterisatie gebruikt.

Desktop en Web

Op Windows werkt Impeller via Direct3D 12 (ingeschakeld in Flutter Master). Op macOS en Linux — respectievelijk via Metal en Vulkan. Voor Web is Impeller niet gepland, omdat de webversie van Flutter CanvasKit gebruikt (Skia via WebAssembly) en shader jank geen kritisch probleem is vanwege het andere shader-compilatiemechanisme in de browser. De webversie zal Skia blijven gebruiken.

Routekaart

Google heeft de routekaart voor Impeller gepubliceerd: 2024 — Impeller standaard op iOS; 2025 — Impeller standaard op Android en Windows; 2026 — volledige verwijdering van Skia uit Flutter Engine. Hierna zal Flutter Impeller gebruiken als de enige rendering-engine, wat de ondersteuning vereenvoudigt, de engine-grootte verkleint en de prestaties op alle platforms verbetert.

Veelgestelde vragen

Hoe schakel ik Impeller in Flutter in?

Op iOS is Impeller standaard ingeschakeld sinds Flutter 3.16. Op Android voegt u de meta-tag io.flutter.embedded_views_preview met waarde true toe in AndroidManifest.xml. Op Windows gebruikt u de vlag --enable-impeller bij het opstarten. In alle gevallen kan het worden geforceerd via FlutterEngine in Dart-code.

Waarom Skia vervangen als het werkt?

Skia werkt, maar heeft fundamentele problemen: shader jank (50–200 ms vertraging voor shader-compilatie), hoog geheugengebruik en beperkingen van de OpenGL-architectuur. Impeller is speciaal ontworpen voor Flutter en lost deze problemen op door offline shader-compilatie en geheugenpools.

Ondersteunt Impeller alle Flutter-widgets?

Ja, Impeller implementeert dezelfde Canvas API als Skia. Alle standaard Flutter-widgets — tekst, afbeeldingen, animaties, aangepaste paints — werken op Impeller zonder wijzigingen. Backward-compatibiliteit wordt gegarandeerd op het niveau van Flutter Engine en de overstap is transparant voor de ontwikkelaar.

Kunnen Skia en Impeller tegelijkertijd worden gebruikt?

Nee, de applicatie gebruikt één rendering-engine tegelijk. De keuze wordt gemaakt bij de initialisatie van Flutter Engine via een vlag. Schakelen tussen Skia en Impeller tijdens runtime van de applicatie is onmogelijk — de renderer wordt vastgesteld voordat de eerste instantie van FlutterEngine wordt aangemaakt.

Wat gebeurt er met Skia na de implementatie van Impeller?

Skia blijft bestaan als een zelfstandige Google-bibliotheek voor Chrome, Android en andere projecten. In Flutter wordt Skia vervangen door Impeller als de primaire renderer. Skia blijft voor de webversie van Flutter (via CanvasKit) en als fallback-optie voor apparaten zonder Vulkan/Metal-ondersteuning.

Samenvatting

  • Impeller — de nieuwe Flutter rendering-engine die shader jank elimineert via offline shader-compilatie
  • Architectuur gebaseerd op SPIR-V, vooraf gecompileerde pipelines en geheugenpools
  • Vergelijking met Skia: geen vertragingen bij eerste rendering, geheugenreductie van 30–40%
  • Back-ends ondersteunen Vulkan, Metal en Direct3D 12 zonder verouderd OpenGL
  • Status op iOS — standaard, op Android en Windows — optioneel (Flutter 3.16+)
  • Compatibiliteit volledig: alle bestaande Flutter-widgets werken zonder codewijzigingen
  • Gebruik Impeller in nieuwe Flutter-projecten en migreer bestaande om vertragingen te elimineren

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook