Impeller — Google tərəfindən Skia-nı əvəz etmək və onun fundamental problemlərini — kadrların ilk renderində şader ləngimələrini (jank), yüksək yaddaş istehlakını və müxtəlif qrafik backendlərin dəstəklənməsindəki çətinlikləri aradan qaldırmaq üçün hazırlanmış müasir Flutter render mühərrikidir. Skia-dan fərqli olaraq, Impeller şaderləri əvvəlcədən (offline) kompilyasiya edir, SPIR-V-ni aralıq təsvir kimi istifadə edir və birbaşa Vulkan, Metal və Direct3D 12 ilə işləyir. Flutter Team (2025) məlumatlarına görə, Impeller şader ləngimələrinin 95%-ə qədərini aradan qaldıraraq, hətta aşağı səviyyəli cihazlarda belə proqnozlaşdırıla bilən 60 FPS təmin edir.
Əsas məqamlar
Impeller — C++ dilində yazılmış, Flutter komandası tərəfindən Skia-nı əsas renderer kimi əvəz etmək üçün hazırlanan açıq mənbəli qrafik render mühərrikidir. Layihə 2021-ci ildə Skia-nın əziyyət çəkdiyi çoxillik shader jank probleminə cavab olaraq elan edilib. Impeller Skia-nın fork-u deyil — mobil GPU-ların və müasir qrafik API-lərin məhdudiyyətləri nəzərə alınmaqla hazırlanmış tamamilə yeni tətbiqdir.
Impeller-in əsas ideyası şader kompilyasiyasını tətbiqin işləmə vaxtından (runtime) onun qurulma mərhələsinə (build time) keçirməkdir. Skia-da şaderlər ilk istifadə zamanı, istifadəçi artıq tətbiqlə qarşılıqlı əlaqədə olduqda kompilyasiya olunur. Impeller bütün şaderləri əvvəlcədən (offline) kompilyasiya edir, onları SPIR-V binar formatına paketləyir və tətbiqlə birlikdə təqdim edir. İş vaxtı Impeller əvvəlcədən kompilyasiya edilmiş şaderləri yükləyir və bu, kompilyasiya ilə bağlı gecikmələri aradan qaldırır.
Impeller həmçinin yaddaş istehlakı problemini həll edir. Skia render prosesində çoxlu sayda müvəqqəti obyektlər (teksturlar, buferlər) yaradır ki, bu da məhdud resurslu cihazlarda yaddaş parçalanmasına səbəb olur. Impeller yaddaş hovuzlarından (memory pools) istifadə edir və ayrılmış resursları təkrar istifadə edir, pik yaddaş istehlakını 30–40% azaldır.
SPIR-V (Standard Portable Intermediate Representation) — Khronos Group tərəfindən hazırlanmış şaderlərin aralıq təsviridir. Impeller bütün şaderlər üçün universal format kimi SPIR-V-dən istifadə edir. Qurulma mərhələsində Impeller dilində (effektləri təsvir etmək üçün özəl C++ DSL) şaderlər SPIR-V-yə kompilyasiya olunur. İş vaxtı SPIR-V yüklənir və platformaya uyğun formata — Metal üçün MSL, Vulkan üçün GLSL və ya Direct3D 12 üçün DXIL-ə tərcümə olunur.
Impeller arxitekturası bir neçə təbəqədən ibarətdir, hər biri ciddi şəkildə müəyyən edilmiş tapşırığı yerinə yetirir: render əmrləri siyahısının işlənməsi, GPU resurslarının idarə edilməsi və şaderlərin icrası. Bu modulluq yeni qrafik API-lərin dəstəyini asanlıqla əlavə etməyə imkan verir.
Aşağı təbəqə — qrafik API (Vulkan, Metal, Direct3D 12) üzərində abstraksiyadır. Impeller OpenGL-i dəstəkləmir, çünki OpenGL şaderlərin səmərəli offline kompilyasiyası imkanlarını təmin etmir. Bu səviyyədə həyata keçirilir: təpə buferlərinin idarə edilməsi, pipeline-ların (qrafik konveyerlərin) yaradılması və keşləşdirilməsi, GPU sinxronizasiyası. Pipeline Impeller-də — şaderləri, rastrlaşdırma və blending parametrlərini özündə birləşdirən əvvəlcədən kompilyasiya edilmiş GPU vəziyyətidir. Bütün pipeline-lar inisializasiya mərhələsində yaradılır və bu, render zamanı kompilyasiyanı aradan qaldırır.
Orta təbəqə — resursların idarə edilməsi sistemidir. GPU resurslarını — teksturları, buferləri, samplerləri ayırır və təkrar istifadə edir. Hər kadrda yeni tekstur yaratmaq əvəzinə, Impeller müxtəlif ölçülü və formatlı tekstur hovuzu saxlayır. Yaddaş hovuzu istifadə olunmayan resursları avtomatik qaytarır və lazım olduqda genişlənə bilər, lakin Skia-ya xas olan parçalanma olmadan.
Yuxarı təbəqə — Flutter Engine-in Canvas API əmrlərini çevirdiyi render qrafıdır. Impeller Display List-i (çəkmə əmrləri siyahısını) qəbul edir və ondan əməliyyat asılılıqlarının qrafını qurur. Qraf optimallaşdırılır: lazımsız render keçidləri silinir, eyni GPU vəziyyətinə malik əməliyyatlar birləşdirilir. Sonra qraf əvvəlcədən yaradılmış pipeline-lardan istifadə edərək Vulkan/Metal çağırışları ardıcıllığına kompilyasiya olunur.
Hər kadr sabit konveyerdən keçir: Display List → render qrafı → qrafın kompilyasiyası → GPU əmrlərinin göndərilməsi. Post-effektlər (bulanıqlıq, kölgələr) və ya dərinlik buferinin hazırlanması üçün əlavə keçidlər əlavə edilə bilər. Kadr vaxtı Impeller-də Skia-dan daha proqnozlaşdırıla biləndir, çünki şader kompilyasiyası üçün qeyri-deterministik gecikmələr mövcud deyil.
Impeller və Skia-nın müqayisəsi renderə yanaşmada fərqləri göstərir. Skia — ümumi təyinatlı universal 2D kitabxanası, Impeller isə mobil UI tələbləri üçün optimallaşdırılmış Flutter üçün ixtisaslaşdırılmış mühərrikdir.
| Parametr | Skia | Impeller |
|---|---|---|
| Şaderlər | Yerində kompilyasiya (runtime) | Offline kompilyasiya (build time) |
| Shader jank | İlk kadr üçün 50–200 ms | Yoxdur (0 ms) |
| Şader formatı | Özəl (SkSL) | SPIR-V (universal) |
| GPU backendleri | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| Yaddaş istehlakı | Yüksək (müvəqqəti teksturlar) | Yaddaş hovuzları, -40% |
| Platformalar | Android, iOS, Web, Desktop | Android, iOS, Desktop |
| Status | Stabil (əsas) | Preview (Skia-nı əvəz edir) |
Əsas fərq — şaderlərə yanaşma. Skia şaderləri istifadə anında kompilyasiya edir, tanış olmayan effektlərin ilk renderində shader jank yaradır. Impeller bunu offline kompilyasiya hesabına aradan qaldırır. Həmçinin Skia OpenGL-i dəstəkləyir ki, bu da Flutter-in web versiyası üçün zəruridir, lakin Impeller OpenGL-dən daha müasir API-lərin xeyrinə imtina edir və bu, mobil cihazlarda daha yaxşı performans verir.
Flutter tətbiqləri üçün Impeller-ə keçid kodun dəyişdirilməsini tələb etmir. Impeller Skia ilə eyni Canvas API-ni tətbiq edir, buna görə də bütün vidjetlər, animasiyalar və fərdi çəkmələr eyni şəkildə işləyir. Geri uyğunluq Flutter Engine səviyyəsində təmin edilir — mühərrik tətbiqin inisializasiyası mərhələsində rendereri (Skia və ya Impeller) seçir.
Impeller Skia ilə müqayisədə birbaşa istifadəçi təcrübəsinə və Flutter tətbiqlərinin performansına təsir edən bir neçə ölçülə bilən üstünlük verir.
Shader jank — Impeller-in tamamilə həll etdiyi Skia-nın əsas problemidir. Flutter tətbiqi qradientlər, maskalar və ya qeyri-standart blendlərlə yeni ekran göstərdikdə, Skia animasiya zamanı şaderləri kompilyasiya edir və bu, kadrların buraxılmasına səbəb olur. Impeller bütün şaderləri qurulma mərhələsində kompilyasiya edir, buna görə də ilk kadr sonrakılar kimi sürətli render olunur. Yavaş GPU-lu cihazlarda (MediaTek Helio, Qualcomm 400 series) fərq xüsusilə nəzərə çarpır — Skia-da hər yeni effekt növü üçün 200 ms gecikmə, Impeller-də isə 0 ms.
Impeller GPU yaddaşını idarə etmək üçün resurs hovuzlarından istifadə edir. Skia-da hər kadr, xüsusilə şəffaflıqla render edərkən və ya saveLayer tətbiq edərkən, müvəqqəti səthlər üçün yeni teksturlar yarada bilər. Impeller teksturları kadrlar arasında təkrar istifadə edir və bu, Android-də pik yaddaş istehlakını 30–40%, iOS-da isə 25% azaldır. Bu, xüsusilə Skia-nın 2 GB RAM-lı cihazlarda OOM səhvlərinə səbəb ola biləcəyi uzun siyahılar və animasiyaları olan tətbiqlər üçün vacibdir.
Skia-da kadr render vaxtı hansı şaderlərin artıq kompilyasiya olunmasından asılı olaraq dəyişə bilər. Yeni effektli ilk kadr 50–200 ms çəkə bilər, sonrakılar isə 3–5 ms. Bu qeyri-müəyyənlik optimallaşdırma və testləşdirməni çətinləşdirir. Impeller bütün şaderlər artıq kompilyasiya olunduğundan və yaddaş ayrılması proqnozlaşdırıla bilən olduğundan vahid kadr vaxtı təmin edir. Impeller ilə Flutter Engine hər kadr üçün vaxt büdcəsini daha dəqiq hesablaya bilər.
Impeller OpenGL qatı olmadan birbaşa Vulkan (Android), Metal (iOS) və Direct3D 12 (Windows) ilə işləyir. Bu bir neçə üstünlük verir: daha aşağı sürücü gecikməsi (OpenGL ilə müqayisədə 50% az), GPU yaddaşı üzərində birbaşa nəzarət və müasir imkanlara çıxış (kafel GPU arxitekturası, GPU-driven rendering). OpenGL artıq inkişaf etdirilmir və onun mobil cihazlardakı sürücüləri tez-tez performans darboğazına çevrilir.
Impeller aktiv inkişaf mərhələsindədir və Flutter Master və Beta kanallarında mövcuddur. Flutter 3.16-dan başlayaraq Impeller iOS-da defolt olaraq aktivdir, Android-də isə konfiqurasiya bayrağı vasitəsilə seçimlidir. Skia-nın Impeller ilə tam əvəz edilməsi 2026-cı ilin stabil Flutter buraxılışlarından birində gözlənilir.
iOS-da Impeller Metal vasitəsilə işləyir və Flutter 3.16-dan defolt olaraq aktivdir. Flutter komandası tətbiqləri Impeller-də test etməyi və problemlər barədə məlumat verməyi tövsiyə edir. Skia-ya qayıtmaq üçün Info.plist faylında Impeller bayrağı istifadə olunur: FlutterEnableImpeller = NO. Flutter Team məlumatlarına görə, iOS-da tətbiqlərin 92%-i görünən reqressiyalar olmadan Impeller-də işləyir və animasiya performansı 25–40% yaxşılaşır.
Android-də Impeller Vulkan vasitəsilə işləyir. Aktiv etmək üçün AndroidManifest.xml-ə meta-teq əlavə edilir: io.flutter.embedded_views_preview. Flutter komandası Impeller-i müxtəlif GPU arxitekturaları (Adreno, Mali, PowerVR) üçün optimallaşdırmağa davam edir. Android-də əsas çətinlik Vulkan dəstəyi olmayan cihazların (Android < 7.0 və ya köhnə GPU) dəstəyidir. Belə cihazlar üçün Skia-da ehtiyat backend və ya proqram rastrlaşdırması ilə Impeller istifadə olunacaq.
Windows-da Impeller Direct3D 12 vasitəsilə işləyir (Flutter Master-da aktivdir). macOS və Linux-da — müvafiq olaraq Metal və Vulkan vasitəsilə. Web üçün Impeller planlaşdırılmır, çünki Flutter-in web versiyası CanvasKit-dən (WebAssembly vasitəsilə Skia) istifadə edir və brauzerdə fərqli şader kompilyasiya mexanizminə görə shader jank kritik problem deyil. Web versiyası Skia-dan istifadə etməyə davam edəcək.
Google Impeller-in yol xəritəsini dərc edib: 2024 — Impeller iOS-da defolt; 2025 — Impeller Android və Windows-da defolt; 2026 — Skia-nın Flutter Engine-dən tam silinməsi. Bundan sonra Flutter Impeller-dən yeganə render mühərriki kimi istifadə edəcək, bu da dəstəyi sadələşdirəcək, mühərrik ölçüsünü azaldacaq və bütün platformalarda performansı yaxşılaşdıracaq.
Tez-tez verilən suallar
iOS-da Impeller Flutter 3.16-dan defolt olaraq aktivdir. Android-də AndroidManifest.xml-ə io.flutter.embedded_views_preview meta-teqini true dəyəri ilə əlavə edin. Windows-da işə salarkən --enable-impeller bayrağından istifadə edin. Bütün hallarda Dart kodunda FlutterEngine vasitəsilə məcburi aktiv edilə bilər.
Skia işləyir, lakin fundamental problemlərə malikdir: shader jank (şader kompilyasiyası üçün 50–200 ms gecikmə), yüksək yaddaş istehlakı və OpenGL arxitekturasının məhdudiyyətləri. Impeller xüsusi olaraq Flutter üçün hazırlanmışdır və bu problemləri şaderlərin offline kompilyasiyası və yaddaş hovuzları vasitəsilə aradan qaldırır.
Bəli, Impeller Skia ilə eyni Canvas API-ni tətbiq edir. Bütün standart Flutter vidjetləri — mətn, şəkillər, animasiyalar, fərdi paint-lər — Impeller-də dəyişiklik olmadan işləyir. Geri uyğunluq Flutter Engine səviyyəsində təmin edilir və keçid tərtibatçı üçün şəffafdır.
Xeyr, tətbiq bir dəfəyə bir render mühərrikindən istifadə edir. Seçim Flutter Engine-in inisializasiyası zamanı bayraq vasitəsilə edilir. Tətbiqin işləməsi zamanı Skia və Impeller arasında keçid mümkün deyil — renderer FlutterEngine-in ilk nümunəsi yaradılmadan əvvəl təyin edilir.
Skia Chrome, Android və digər layihələr üçün Google-ın müstəqil kitabxanası olaraq mövcud olmağa davam edəcək. Flutter-də Skia əsas renderer olaraq Impeller ilə əvəz olunacaq. Skia Flutter-in web versiyası (CanvasKit vasitəsilə) və Vulkan/Metal dəstəyi olmayan cihazlar üçün ehtiyat variant kimi qalacaq.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun