Impeller este un motor modern de randare pentru Flutter, dezvoltat de Google pentru a înlocui Skia și a elimina problemele sale fundamentale: întârzierile de shader (jank) la prima randare a cadrelor, consumul ridicat de memorie și dificultatea suportării diferitelor backend-uri grafice. Spre deosebire de Skia, Impeller compilează shader-urile în avans (offline), utilizează SPIR-V ca reprezentare intermediară și lucrează direct cu Vulkan, Metal și Direct3D 12. Conform datelor Flutter Team (2025), Impeller elimină până la 95% din întârzierile de shader, asigurând 60 FPS predictibil chiar și pe dispozitivele entry-level.
Principalele puncte
Impeller — este un motor de randare grafică cu sursă deschisă, scris în C++, care este dezvoltat de echipa Flutter pentru a înlocui Skia ca renderer principal. Proiectul a fost anunțat în 2021 ca răspuns la problema de lungă durată a shader jank de care suferă Skia. Impeller nu este un fork al Skia — este o implementare complet nouă, proiectată ținând cont de limitările GPU-urilor mobile și ale API-urilor grafice moderne.
Ideea principală a Impeller constă în mutarea compilării shader-urilor în faza de build a aplicației, nu în timpul execuției. În Skia, shader-urile sunt compilate la prima utilizare, când utilizatorul interacționează deja cu aplicația. Impeller compilează toate shader-urile în avans (offline), le împachetează în formatul binar SPIR-V și le livrează împreună cu aplicația. În timpul execuției, Impeller încarcă shader-urile precompilate, ceea ce elimină întârzierile legate de compilare.
Impeller rezolvă și problema consumului de memorie. Skia creează numeroase obiecte temporare (texturi, buffere) în procesul de randare, ceea ce duce la fragmentarea memoriei pe dispozitivele cu resurse limitate. Impeller utilizează pool-uri de memorie (memory pools) și reutilizează resursele alocate, reducând consumul de vârf al memoriei cu 30–40%.
SPIR-V (Standard Portable Intermediate Representation) — este o reprezentare intermediară a shader-urilor dezvoltată de Khronos Group. Impeller utilizează SPIR-V ca format universal pentru toate shader-urile. În faza de build, shader-urile în limbajul Impeller (DSL propriu C++ pentru descrierea efectelor) sunt compilate în SPIR-V. În timpul execuției, SPIR-V este încărcat și translat în formatul specific platformei — MSL pentru Metal, GLSL pentru Vulkan sau DXIL pentru Direct3D 12.
Arhitectura Impeller constă din mai multe straturi, fiecare îndeplinind o sarcină strict definită: procesarea listei de comenzi de randare, gestionarea resurselor GPU și executarea shader-urilor. Această modularitate permite adăugarea ușoară a suportului pentru noi API-uri grafice.
Stratul inferior — este o abstracție peste API-ul grafic (Vulkan, Metal, Direct3D 12). Impeller nu suportă OpenGL, deoarece OpenGL nu oferă capacități pentru compilarea offline eficientă a shader-urilor. La acest nivel sunt implementate: gestionarea bufferelor de vârfuri, crearea și cache-ul pipeline-urilor (conductelor grafice), sincronizarea GPU. Pipeline-ul în Impeller — este o stare GPU precompilată care include shader-urile, setările de rasterizare și blending. Toate pipeline-urile sunt create în faza de inițializare, ceea ce elimină compilarea în timpul randării.
Stratul mijlociu — este sistemul de gestionare a resurselor. Acesta alocă și reutilizează resursele GPU: texturi, buffere, samplere. În loc să creeze o textură nouă la fiecare cadru, Impeller menține un pool de texturi de diferite dimensiuni și formate. Pool-ul de memorie returnează automat resursele neutilizate și se poate extinde la nevoie, dar fără fragmentarea caracteristică Skia.
Stratul superior — este graful de randare în care Flutter Engine transformă comenzile Canvas API. Impeller primește Display List (lista comenzilor de desenare) și construiește din ea un graf al dependențelor operațiilor. Graful este optimizat: sunt eliminate trecerile de randare inutile, sunt combinate operațiile cu aceeași stare GPU. Apoi graful este compilat într-o secvență de apeluri Vulkan/Metal folosind pipeline-urile precreate.
Fiecare cadru trece printr-o conductă fixă: Display List → graf de randare → compilarea grafului → trimiterea comenzilor GPU. Treceri suplimentare pot fi adăugate pentru efecte post-procesare (blur, umbre) sau pregătirea bufferului de adâncime. Timpul cadrului în Impeller este mai predictibil decât în Skia, deoarece nu există întârzieri nedeterministe pentru compilarea shader-urilor.
Comparația dintre Impeller și Skia relevă diferențe în abordarea randării. Skia — este o bibliotecă 2D universală de uz general, iar Impeller — este un motor specializat pentru Flutter, optimizat pentru cerințele UI-ului mobil.
| Parametru | Skia | Impeller |
|---|---|---|
| Shader-e | Compilare la runtime | Compilare offline (build time) |
| Shader jank | 50–200 ms pentru primul cadru | Absent (0 ms) |
| Format shader-e | Propriu (SkSL) | SPIR-V (universal) |
| Backend-uri GPU | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| Consum memorie | Ridicat (texturi temporare) | Pool-uri de memorie, până la -40% |
| Platforme | Android, iOS, Web, Desktop | Android, iOS, Desktop |
| Status | Stabil (principal) | Preview (înlocuiește Skia) |
Diferența cheie — abordarea shader-urilor. Skia compilează shader-urile în momentul utilizării, creând shader jank la prima randare a efectelor necunoscute. Impeller elimină acest lucru prin compilare offline. De asemenea, Skia suportă OpenGL, necesar pentru versiunea web a Flutter, dar Impeller renunță la OpenGL în favoarea API-urilor mai moderne, ceea ce oferă o performanță mai bună pe dispozitivele mobile.
Pentru aplicațiile Flutter, trecerea la Impeller nu necesită modificarea codului. Impeller implementează același Canvas API ca și Skia, astfel încât toate widget-urile, animațiile și desenele personalizate funcționează la fel. Compatibilitatea inversă este asigurată la nivelul Flutter Engine — motorul alege renderer-ul (Skia sau Impeller) în faza de inițializare a aplicației.
Impeller oferă câteva avantaje măsurabile față de Skia, care afectează direct experiența utilizatorului și performanța aplicațiilor Flutter.
Shader jank — principala problemă a Skia pe care Impeller o rezolvă complet. Când o aplicație Flutter afișează un ecran nou cu gradiente, măști sau blend-uri nestandard, Skia compilează shader-urile în timpul animației, ceea ce duce la omiterea cadrelor. Impeller compilează toate shader-urile în faza de build, astfel încât primul cadru se randeează la fel de rapid ca și următoarele. Pe dispozitivele cu GPU lent (MediaTek Helio, Qualcomm 400 series) diferența este deosebit de vizibilă — până la 200 ms întârziere pentru fiecare tip nou de efect în Skia față de 0 ms în Impeller.
Impeller utilizează pool-uri de resurse pentru gestionarea memoriei GPU. În Skia, fiecare cadru poate crea texturi noi pentru suprafețe temporare, în special la randarea cu transparență sau la utilizarea saveLayer. Impeller reutilizează texturile între cadre, ceea ce reduce consumul de vârf al memoriei cu 30–40% pe Android și până la 25% pe iOS. Acest lucru este deosebit de important pentru aplicațiile cu liste lungi și animații, unde Skia putea cauza erori OOM pe dispozitivele cu 2 GB RAM.
În Skia, timpul de randare a cadrului poate varia în funcție de care shader-e au fost deja compilate. Primul cadru cu un efect nou poate dura 50–200 ms, în timp ce următoarele — 3–5 ms. Această imprevizibilitate îngreunează optimizarea și testarea. Impeller asigură un timp uniform al cadrului, deoarece toate shader-urile sunt deja compilate, iar alocarea memoriei este predictibilă. Flutter Engine cu Impeller poate calcula mai exact bugetul de timp pentru fiecare cadru.
Impeller funcționează direct cu Vulkan (Android), Metal (iOS) și Direct3D 12 (Windows), fără stratul OpenGL. Acest lucru oferă câteva avantaje: latență mai mică a driverului (cu până la 50% mai puțin decât prin OpenGL), control direct asupra memoriei GPU și acces la capabilități moderne (arhitectura tile-based GPU, GPU-driven rendering). OpenGL nu mai este dezvoltat, iar driverele sale pe dispozitivele mobile devin adesea un blocaj de performanță.
Impeller se află în dezvoltare activă și este disponibil în canalele Flutter Master și Beta. Începând cu Flutter 3.16, Impeller este activat implicit pe iOS, iar pe Android — opțional printr-un flag de configurare. Înlocuirea completă a Skia cu Impeller este așteptată într-una din versiunile stabile Flutter din 2026.
Pe iOS, Impeller funcționează prin Metal și este activat implicit din Flutter 3.16. Echipa Flutter recomandă testarea aplicațiilor pe Impeller și raportarea problemelor. Pentru revenirea la Skia se utilizează flag-ul Impeller în fișierul Info.plist: FlutterEnableImpeller = NO. Conform datelor Flutter Team, 92% din aplicațiile pe iOS funcționează pe Impeller fără regresii vizibile, iar performanța animațiilor se îmbunătățește cu 25–40%.
Pe Android, Impeller funcționează prin Vulkan. Pentru activare, în AndroidManifest.xml se adaugă un meta-tag: io.flutter.embedded_views_preview. Echipa Flutter continuă optimizarea Impeller pentru diverse arhitecturi GPU (Adreno, Mali, PowerVR). Principala provocare pe Android este suportul dispozitivelor fără Vulkan (Android < 7.0 sau GPU-uri vechi). Pentru astfel de dispozitive va fi utilizat un backend de rezervă pe Skia sau Impeller cu rasterizare software.
Pe Windows, Impeller funcționează prin Direct3D 12 (activat în Flutter Master). Pe macOS și Linux — prin Metal și, respectiv, Vulkan. Pentru Web, Impeller nu este planificat, deoarece versiunea web a Flutter utilizează CanvasKit (Skia prin WebAssembly), iar shader jank nu este o problemă critică din cauza mecanismului diferit de compilare a shader-urilor în browser. Versiunea web va continua să folosească Skia.
Google a publicat foaia de parcurs a Impeller: 2024 — Impeller implicit pe iOS; 2025 — Impeller implicit pe Android și Windows; 2026 — eliminarea completă a Skia din Flutter Engine. După aceasta, Flutter va utiliza Impeller ca unic motor de randare, ceea ce va simplifica suportul, va reduce dimensiunea motorului și va îmbunătăți performanța pe toate platformele.
Întrebări frecvente
Pe iOS, Impeller este activat implicit din Flutter 3.16. Pe Android, adăugați în AndroidManifest.xml meta-tag-ul io.flutter.embedded_views_preview cu valoarea true. Pe Windows, utilizați flag-ul --enable-impeller la pornire. În toate cazurile, poate fi forțat prin FlutterEngine în codul Dart.
Skia funcționează, dar are probleme fundamentale: shader jank (50–200 ms întârziere pentru compilarea shader-urilor), consum ridicat de memorie și limitări ale arhitecturii OpenGL. Impeller este proiectat special pentru Flutter și elimină aceste probleme prin compilarea offline a shader-urilor și pool-uri de memorie.
Da, Impeller implementează același Canvas API ca și Skia. Toate widget-urile standard Flutter — text, imagini, animații, paint-uri personalizate — funcționează pe Impeller fără modificări. Compatibilitatea inversă este asigurată la nivelul Flutter Engine, iar tranziția este transparentă pentru dezvoltator.
Nu, aplicația utilizează un singur motor de randare odată. Alegerea se face la inițializarea Flutter Engine printr-un flag. Comutarea între Skia și Impeller în timpul execuției aplicației este imposibilă — renderer-ul este fixat înainte de crearea primei instanțe FlutterEngine.
Skia va continua să existe ca bibliotecă independentă Google pentru Chrome, Android și alte proiecte. În Flutter, Skia va fi înlocuită de Impeller ca renderer principal. Skia va rămâne pentru versiunea web a Flutter (prin CanvasKit) și ca opțiune de rezervă pentru dispozitivele fără suport Vulkan/Metal.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.