Impeller ist eine moderne Rendering-Engine für Flutter, die von Google entwickelt wurde, um Skia zu ersetzen und dessen grundlegende Probleme zu beheben: Shader-Ruckeln (Jank) beim ersten Frame-Rendering, hoher Speicherverbrauch und die Komplexität der Unterstützung verschiedener Grafik-Backends. Im Gegensatz zu Skia kompiliert Impeller Shader vorab (offline), verwendet SPIR-V als Zwischendarstellung und arbeitet direkt mit Vulkan, Metal und Direct3D 12. Laut Flutter Team (2025) beseitigt Impeller bis zu 95% der Shader-Ruckler und sorgt selbst auf Einsteigergeräten für vorhersagbare 60 FPS.
Wichtige Punkte
Impeller ist eine in C++ geschriebene Open-Source-Grafik-Rendering-Engine, die vom Flutter-Team entwickelt wurde, um Skia als primären Renderer zu ersetzen. Das Projekt wurde 2021 als Antwort auf das langjährige Shader-Jank-Problem angekündigt, unter dem Skia leidet. Impeller ist kein Fork von Skia — es ist eine völlig neue Implementierung, die unter Berücksichtigung der Einschränkungen mobiler GPUs und moderner Grafik-APIs entwickelt wurde.
Die Hauptidee von Impeller besteht darin, die Shader-Kompilierung in die Build-Phase der Anwendung zu verlagern, anstatt sie zur Laufzeit durchzuführen. In Skia werden Shader bei der ersten Verwendung kompiliert, wenn der Benutzer bereits mit der Anwendung interagiert. Impeller kompiliert alle Shader vorab (offline), verpackt sie im SPIR-V-Binärformat und liefert sie mit der Anwendung aus. Zur Laufzeit lädt Impeller vorcompilierte Shader, wodurch Kompilierungsverzögerungen entfallen.
Impeller löst auch das Problem des Speicherverbrauchs. Skia erstellt während des Renderns viele temporäre Objekte (Texturen, Buffer), was auf Geräten mit begrenzten Ressourcen zu Speicherfragmentierung führt. Impeller verwendet Speicherpools und wiederverwendet zugewiesene Ressourcen, wodurch der Spitzenspeicherverbrauch um 30–40% reduziert wird.
SPIR-V (Standard Portable Intermediate Representation) ist eine von der Khronos Group entwickelte Zwischendarstellung für Shader. Impeller verwendet SPIR-V als universelles Format für alle Shader. Während der Build-Phase werden Shader, die in der Impeller-Sprache (einem benutzerdefinierten C++-DSL zur Beschreibung von Effekten) geschrieben sind, in SPIR-V kompiliert. Zur Laufzeit wird SPIR-V geladen und in ein plattformspezifisches Format übersetzt — MSL für Metal, GLSL für Vulkan oder DXIL für Direct3D 12.
Die Architektur von Impeller besteht aus mehreren Schichten, die jeweils eine streng definierte Aufgabe ausführen: Verarbeitung der Rendering-Befehlsliste, Verwaltung von GPU-Ressourcen und Ausführung von Shadern. Diese Modularität erleichtert die Unterstützung neuer Grafik-APIs.
Die unterste Schicht ist eine Abstraktion über der Grafik-API (Vulkan, Metal, Direct3D 12). Impeller unterstützt kein OpenGL, da OpenGL keine effiziente Offline-Shader-Kompilierung ermöglicht. Auf dieser Ebene werden implementiert: Vertex-Puffer-Verwaltung, Erstellung und Caching von Pipelines (Grafik-Pipelines) und GPU-Synchronisation. Eine Pipeline in Impeller ist ein vorcompilierter GPU-Zustand, der Shader, Rasterisierungseinstellungen und Blending umfasst. Alle Pipelines werden während der Initialisierung erstellt, wodurch die Kompilierung während des Renderings entfällt.
Die mittlere Schicht ist ein Ressourcenverwaltungssystem. Es reserviert und wiederverwendet GPU-Ressourcen: Texturen, Puffer, Sampler. Anstatt bei jedem Frame eine neue Textur zu erstellen, unterhält Impeller einen Pool von Texturen verschiedener Größen und Formate. Der Speicherpool gibt ungenutzte Ressourcen automatisch zurück und kann bei Bedarf erweitert werden, jedoch ohne die für Skia charakteristische Fragmentierung.
Die oberste Schicht ist der Rendering-Graph, in den die Flutter Engine Canvas-API-Befehle umwandelt. Impeller empfängt eine Display List und erstellt daraus einen Abhängigkeitsgraphen von Operationen. Der Graph wird optimiert: redundante Render-Durchläufe werden entfernt, Operationen mit demselben GPU-Zustand werden zusammengeführt. Der Graph wird dann mit vorerstellten Pipelines in eine Sequenz von Vulkan/Metal-Aufrufen kompiliert.
Jeder Frame durchläuft eine feste Pipeline: Display List → Rendering-Graph → Graph-Kompilierung → GPU-Befehlssendung. Zusätzliche Durchläufe können für Post-Effekte (Unschärfe, Schatten) oder zur Vorbereitung des Tiefenpuffers hinzugefügt werden. Die Frame-Zeit in Impeller ist vorhersagbarer als in Skia, da es keine nicht-deterministischen Verzögerungen durch Shader-Kompilierung gibt.
Der Vergleich zwischen Impeller und Skia zeigt Unterschiede im Rendering-Ansatz. Skia ist eine universelle 2D-Bibliothek für allgemeine Zwecke, während Impeller eine spezialisierte Engine für Flutter ist, die für mobile UI-Anforderungen optimiert wurde.
| Parameter | Skia | Impeller |
|---|---|---|
| Shader | Laufzeit-Kompilierung | Offline-Kompilierung (Build-Zeit) |
| Shader-Jank | 50–200 ms beim ersten Frame | Keine (0 ms) |
| Shader-Format | Eigenentwicklung (SkSL) | SPIR-V (universell) |
| GPU-Backends | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| Speicherverbrauch | Hoch (temporäre Texturen) | Speicherpools, bis zu -40% |
| Plattformen | Android, iOS, Web, Desktop | Android, iOS, Desktop |
| Status | Stabil (primär) | Preview (ersetzt Skia) |
Der Hauptunterschied ist der Ansatz bei Shadern. Skia kompiliert Shader zum Zeitpunkt der Verwendung und erzeugt Shader-Jank beim erstmaligen Rendern unbekannter Effekte. Impeller beseitigt dies durch Offline-Kompilierung. Außerdem unterstützt Skia OpenGL, was für die Web-Version von Flutter notwendig ist, aber Impeller verzichtet zugunsten modernerer APIs auf OpenGL, was eine bessere Leistung auf mobilen Geräten bietet.
Für Flutter-Anwendungen erfordert der Wechsel zu Impeller keine Code-Änderungen. Impeller implementiert dieselbe Canvas-API wie Skia, daher funktionieren alle Widgets, Animationen und benutzerdefinierten Zeichnungen identisch. Die Rückwärtskompatibilität wird auf der Ebene der Flutter Engine sichergestellt — die Engine wählt den Renderer (Skia oder Impeller) während der Initialisierung der Anwendung aus.
Impeller bietet mehrere messbare Vorteile gegenüber Skia, die sich direkt auf die Benutzererfahrung und die Leistung von Flutter-Anwendungen auswirken.
Shader-Jank ist das Hauptproblem von Skia, das Impeller vollständig löst. Wenn eine Flutter-Anwendung einen neuen Bildschirm mit Farbverläufen, Masken oder nicht standardmäßigen Überblendungen anzeigt, kompiliert Skia Shader während der Animation, was zu Frame-Ausfällen führt. Impeller kompiliert alle Shader zur Build-Zeit, sodass der erste Frame genauso schnell gerendert wird wie die folgenden. Auf Geräten mit langsamer GPU (MediaTek Helio, Qualcomm 400-Serie) ist der Unterschied besonders deutlich — bis zu 200 ms Verzögerung für jeden neuen Effekttyp in Skia gegenüber 0 ms in Impeller.
Impeller verwendet Ressourcenpools zur Verwaltung des GPU-Speichers. In Skia kann jeder Frame neue Texturen für temporäre Oberflächen erstellen, insbesondere beim Rendern mit Transparenz oder bei Verwendung von saveLayer. Impeller verwendet Texturen zwischen Frames wieder, wodurch der Spitzenspeicherverbrauch auf Android um 30–40% und auf iOS um bis zu 25% reduziert wird. Dies ist besonders wichtig für Anwendungen mit langen Listen und Animationen, bei denen Skia auf Geräten mit 2 GB RAM OOM-Fehler verursachen konnte.
In Skia kann die Frame-Renderzeit variieren, je nachdem, welche Shader bereits kompiliert wurden. Der erste Frame mit einem neuen Effekt kann 50–200 ms dauern, während nachfolgende Frames 3–5 ms benötigen. Diese Unvorhersagbarkeit erschwert Optimierung und Tests. Impeller sorgt für eine gleichmäßige Frame-Zeit, da alle Shader bereits kompiliert sind und die Speicherzuweisung vorhersagbar ist. Die Flutter Engine mit Impeller kann das Zeitbudget für jeden Frame genauer berechnen.
Impeller arbeitet direkt mit Vulkan (Android), Metal (iOS) und Direct3D 12 (Windows), ohne die OpenGL-Ebene. Dies bietet mehrere Vorteile: geringere Treiberlatenz (bis zu 50% weniger als über OpenGL), direkte Kontrolle über den GPU-Speicher und Zugriff auf moderne Funktionen (geteilte GPU-Architektur, GPU-gesteuertes Rendering). OpenGL entwickelt sich nicht mehr weiter und seine Treiber auf mobilen Geräten werden oft zu einem Leistungsengpass.
Impeller befindet sich in aktiver Entwicklung und ist in den Flutter Master- und Beta-Kanälen verfügbar. Ab Flutter 3.16 ist Impeller auf iOS standardmäßig aktiviert und auf Android optional über ein Konfigurations-Flag. Die vollständige Ablösung von Skia durch Impeller wird in einer der stabilen Flutter-Versionen im Jahr 2026 erwartet.
Auf iOS arbeitet Impeller über Metal und ist seit Flutter 3.16 standardmäßig aktiviert. Das Flutter-Team empfiehlt, Anwendungen auf Impeller zu testen und Probleme zu melden. Für die Rückkehr zu Skia verwenden Sie das Impeller-Flag in der Info.plist-Datei: FlutterEnableImpeller = NO. Laut Flutter Team laufen 92% der iOS-Anwendungen ohne sichtbare Regressionen auf Impeller, und die Animationsleistung verbessert sich um 25–40%.
Auf Android arbeitet Impeller über Vulkan. Zum Aktivieren fügen Sie den Meta-Tag io.flutter.embedded_views_preview in AndroidManifest.xml hinzu. Das Flutter-Team optimiert Impeller weiterhin für verschiedene GPU-Architekturen (Adreno, Mali, PowerVR). Die größte Herausforderung auf Android ist die Unterstützung von Geräten ohne Vulkan (Android < 7.0 oder alte GPUs). Für solche Geräte wird ein Fallback-Backend auf Skia oder Impeller mit Software-Rasterisierung verwendet.
Auf Windows arbeitet Impeller über Direct3D 12 (aktiviert in Flutter Master). Auf macOS und Linux — über Metal bzw. Vulkan. Für das Web ist Impeller nicht geplant, da die Web-Version von Flutter CanvasKit (Skia über WebAssembly) verwendet und Shader-Jank aufgrund eines anderen Shader-Kompilierungsmechanismus im Browser kein kritisches Problem darstellt. Die Web-Version wird weiterhin Skia verwenden.
Google hat den Impeller-Fahrplan veröffentlicht: 2024 — Impeller standardmäßig auf iOS; 2025 — Impeller standardmäßig auf Android und Windows; 2026 — vollständige Entfernung von Skia aus der Flutter Engine. Danach wird Flutter Impeller als einzige Rendering-Engine verwenden, was die Wartung vereinfacht, die Engine-Größe reduziert und die Leistung auf allen Plattformen verbessert.
Häufig gestellte Fragen
Auf iOS ist Impeller seit Flutter 3.16 standardmäßig aktiviert. Auf Android fügen Sie den Meta-Tag io.flutter.embedded_views_preview mit dem Wert true in AndroidManifest.xml hinzu. Auf Windows verwenden Sie das Flag --enable-impeller beim Start. In allen Fällen kann es über FlutterEngine im Dart-Code erzwungen werden.
Skia funktioniert, hat aber grundlegende Probleme: Shader-Jank (50–200 ms Verzögerung bei der Shader-Kompilierung), hoher Speicherverbrauch und Einschränkungen der OpenGL-Architektur. Impeller ist speziell für Flutter entwickelt und löst diese Probleme durch Offline-Shader-Kompilierung und Speicherpools.
Ja, Impeller implementiert dieselbe Canvas-API wie Skia. Alle Standard-Flutter-Widgets — Text, Bilder, Animationen, benutzerdefinierte Zeichnungen — funktionieren ohne Änderungen auf Impeller. Die Rückwärtskompatibilität wird auf der Ebene der Flutter Engine sichergestellt, und der Übergang ist für den Entwickler transparent.
Nein, eine Anwendung verwendet jeweils eine Rendering-Engine. Die Auswahl erfolgt bei der Initialisierung der Flutter Engine über ein Flag. Ein Wechsel zwischen Skia und Impeller während der Laufzeit ist nicht möglich — der Renderer wird bis zur Erstellung der ersten FlutterEngine-Instanz fixiert.
Skia wird weiterhin als unabhängige Google-Bibliothek für Chrome, Android und andere Projekte existieren. In Flutter wird Skia durch Impeller als primären Renderer ersetzt. Skia bleibt für die Web-Version von Flutter (über CanvasKit) und als Fallback-Option für Geräte ohne Vulkan/Metal-Unterstützung erhalten.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch