Impeller, Google tarafından Skia'nın yerini almak ve temel sorunlarını (ilk kare oluşturma sırasında gölgelendirici takılmaları (jank), yüksek bellek tüketimi ve farklı grafik arka uçlarını desteklemenin karmaşıklığı) gidermek için geliştirilen modern bir Flutter oluşturma motorudur. Skia'nın aksine Impeller, gölgelendiricileri önceden (çevrimdışı) derler, SPIR-V'yi ara temsil olarak kullanır ve doğrudan Vulkan, Metal ve Direct3D 12 ile çalışır. Flutter Team (2025)'e göre, Impeller gölgelendirici takılmalarının %95'ine kadarını ortadan kaldırarak giriş seviyesi cihazlarda bile öngörülebilir 60 FPS sağlar.
Önemli Noktalar
Impeller, Flutter ekibi tarafından Skia'nın yerine birincil oluşturucu olarak geliştirilen, C++ ile yazılmış açık kaynaklı bir grafik oluşturma motorudur. Proje, Skia'nın muzdarip olduğu uzun süredir devam eden gölgelendirici takılması sorununa bir yanıt olarak 2021'de duyuruldu. Impeller, Skia'nın bir çatalı değildir — mobil GPU'ların ve modern grafik API'lerinin sınırlamaları dikkate alınarak tasarlanmış tamamen yeni bir uygulamadır.
Impeller'ın ana fikri, gölgelendirici derlemeyi çalışma zamanı yerine uygulama derleme aşamasına taşımaktır. Skia'da gölgelendiriciler, kullanıcı uygulamayla zaten etkileşim halindeyken ilk kullanımda derlenir. Impeller tüm gölgelendiricileri önceden (çevrimdışı) derler, bunları SPIR-V ikili biçiminde paketler ve uygulamayla birlikte dağıtır. Çalışma zamanında Impeller, önceden derlenmiş gölgelendiricileri yükleyerek derleme gecikmelerini ortadan kaldırır.
Impeller ayrıca bellek tüketimi sorununu da çözer. Skia, oluşturma sırasında birçok geçici nesne (doku, arabellek) oluşturarak sınırlı kaynaklara sahip cihazlarda bellek parçalanmasına yol açar. Impeller bellek havuzları kullanır ve ayrılan kaynakları yeniden kullanarak tepe bellek tüketimini %30–40 oranında azaltır.
SPIR-V (Standart Taşınabilir Ara Temsil), Khronos Group tarafından geliştirilen bir ara gölgelendirici temsilidir. Impeller, tüm gölgelendiriciler için SPIR-V'yi evrensel bir biçim olarak kullanır. Derleme aşamasında, Impeller dilinde (efektleri tanımlamak için özel bir C++ DSL) yazılan gölgelendiriciler SPIR-V'ye derlenir. Çalışma zamanında SPIR-V yüklenir ve platforma özgü bir biçime çevrilir — Metal için MSL, Vulkan için GLSL veya Direct3D 12 için DXIL.
Impeller'ın mimarisi, her biri kesin olarak tanımlanmış bir görevi (oluşturma komut listesini işleme, GPU kaynaklarını yönetme ve gölgelendiricileri yürütme) gerçekleştiren birkaç katmandan oluşur. Bu modülerlik, yeni grafik API'leri için destek eklemeyi kolaylaştırır.
En alt katman, grafik API'si (Vulkan, Metal, Direct3D 12) üzerinde bir soyutlamadır. Impeller, OpenGL'i desteklemez çünkü OpenGL, verimli çevrimdışı gölgelendirici derleme için yetenekler sağlamaz. Bu seviyede şunlar uygulanır: köşe arabellek yönetimi, ardışık düzen oluşturma ve önbelleğe alma, GPU senkronizasyonu. Impeller'da bir ardışık düzen, gölgelendiricileri, rasterleştirme ayarlarını ve harmanlamayı içeren önceden derlenmiş bir GPU durumudur. Tüm ardışık düzenler başlatma sırasında oluşturulur ve oluşturma sırasında derleme işlemini ortadan kaldırır.
Orta katman bir kaynak yönetim sistemidir. GPU kaynaklarını (dokular, arabellekler, örnekleyiciler) ayırır ve yeniden kullanır. Impeller, her karede yeni bir doku oluşturmak yerine, çeşitli boyut ve biçimlerdeki dokulardan oluşan bir havuz tutar. Bellek havuzu, kullanılmayan kaynakları otomatik olarak iade eder ve gerektiğinde genişleyebilir, ancak Skia'nın karakteristik özelliği olan parçalanma olmadan.
En üst katman, Flutter Engine'in Canvas API komutlarını dönüştürdüğü oluşturma grafiğidir. Impeller bir Görüntü Listesi alır ve bundan bir işlem bağımlılık grafiği oluşturur. Grafik optimize edilir: gereksiz oluşturma geçişleri kaldırılır, aynı GPU durumuna sahip işlemler birleştirilir. Grafik daha sonra önceden oluşturulmuş ardışık düzenler kullanılarak bir Vulkan/Metal çağrı dizisine derlenir.
Her kare sabit bir ardışık düzenden geçer: Görüntü Listesi → oluşturma grafiği → grafik derleme → GPU komut gönderimi. Son efektler (bulanıklaştırma, gölgeler) veya derinlik arabelleği hazırlığı için ek geçişler eklenebilir. Impeller'da kare süresi Skia'dan daha öngörülebilirdir çünkü gölgelendirici derlemesinden kaynaklanan belirlenemeyen gecikmeler yoktur.
Impeller ve Skia karşılaştırması, oluşturma yaklaşımındaki farklılıkları gösterir. Skia genel amaçlı bir 2B kitaplığı iken Impeller, mobil kullanıcı arayüzü gereksinimleri için optimize edilmiş Flutter'a özel bir motordur.
| Parametre | Skia | Impeller |
|---|---|---|
| Gölgelendiriciler | Çalışma zamanında derleme | Çevrimdışı derleme (derleme zamanı) |
| Gölgelendirici takılması | İlk karede 50–200 ms | Yok (0 ms) |
| Gölgelendirici biçimi | Sahipli (SkSL) | SPIR-V (evrensel) |
| GPU arka uçları | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| Bellek tüketimi | Yüksek (geçici dokular) | Bellek havuzları, -%40'a kadar |
| Platformlar | Android, iOS, Web, Masaüstü | Android, iOS, Masaüstü |
| Durum | Kararlı (birincil) | Önizleme (Skia'nın yerini alıyor) |
Temel fark, gölgelendiricilere yaklaşımdır. Skia, gölgelendiricileri kullanım anında derleyerek bilinmeyen efektleri ilk kez oluştururken gölgelendirici takılması yaratır. Impeller bunu çevrimdışı derleme yoluyla ortadan kaldırır. Ayrıca Skia, Flutter'ın web sürümü için gerekli olan OpenGL'i destekler, ancak Impeller daha modern API'ler lehine OpenGL'den vazgeçerek mobil cihazlarda daha iyi performans sunar.
Flutter uygulamaları için Impeller'a geçiş, kod değişikliği gerektirmez. Impeller, Skia ile aynı Canvas API'yi uygular, bu nedenle tüm widgets, animasyonlar ve özel çizimler aynı şekilde çalışır. Geriye dönük uyumluluk Flutter Engine düzeyinde sağlanır — motor, uygulama başlatma aşamasında oluşturucuyu (Skia veya Impeller) seçer.
Impeller, Skia'ya kıyasla kullanıcı deneyimini ve Flutter uygulama performansını doğrudan etkileyen birkaç ölçülebilir avantaj sunar.
Gölgelendirici takılması, Impeller'ın tamamen çözdüğü Skia'nın ana sorunudur. Bir Flutter uygulaması, gradyanlar, maskeler veya standart olmayan karışımlar içeren yeni bir ekran görüntülediğinde, Skia animasyon sırasında gölgelendiricileri derleyerek kare düşüşlerine neden olur. Impeller tüm gölgelendiricileri derleme aşamasında derler, bu nedenle ilk kare sonraki kareler kadar hızlı oluşturulur. Yavaş GPU'ya (MediaTek Helio, Qualcomm 400 serisi) sahip cihazlarda fark özellikle belirgindir — Skia'da her yeni efekt türü için 200 ms'ye kadar gecikme yaşanırken Impeller'da 0 ms'dir.
Impeller, GPU belleği yönetimi için kaynak havuzları kullanır. Skia'da, özellikle saydamlıkla oluşturma veya saveLayer kullanımı sırasında her kare geçici yüzeyler için yeni dokular oluşturabilir. Impeller, dokuları kareler arasında yeniden kullanarak Android'de tepe bellek tüketimini %30–40 ve iOS'te %25'e kadar azaltır. Bu, uzun listeler ve animasyonlar içeren uygulamalar için özellikle önemlidir; Skia, 2 GB RAM'li cihazlarda OOM hatalarına neden olabiliyordu.
Skia'da kare oluşturma süresi, hangi gölgelendiricilerin zaten derlendiğine bağlı olarak değişebilir. Yeni bir efekt içeren ilk kare 50–200 ms sürebilirken, sonraki kareler 3–5 ms sürer. Bu öngörülemezlik optimizasyonu ve test etmeyi zorlaştırır. Impeller, tüm gölgelendiriciler zaten derlenmiş olduğu ve bellek ayırma öngörülebilir olduğu için tutarlı kare süresi sağlar. Impeller ile Flutter Engine, her kare için zaman bütçesini daha doğru hesaplayabilir.
Impeller, OpenGL katmanı olmadan doğrudan Vulkan (Android), Metal (iOS) ve Direct3D 12 (Windows) ile çalışır. Bu, birkaç avantaj sağlar: daha düşük sürücü gecikmesi (OpenGL'ye göre %50'ye kadar daha az), GPU belleği üzerinde doğrudan kontrol ve modern özelliklere (döşemeli GPU mimarisi, GPU tabanlı oluşturma) erişim. OpenGL artık gelişmiyor ve mobil cihazlardaki sürücüleri genellikle performans darboğazı haline geliyor.
Impeller aktif geliştirme aşamasındadır ve Flutter Master ve Beta kanallarında mevcuttur. Flutter 3.16'dan itibaren Impeller, iOS'ta varsayılan olarak etkindir ve Android'de bir yapılandırma bayrağı aracılığıyla isteğe bağlıdır. Skia'nın Impeller ile tamamen değiştirilmesi, 2026'daki kararlı Flutter sürümlerinden birinde beklenmektedir.
iOS'ta Impeller, Metal aracılığıyla çalışır ve Flutter 3.16'dan itibaren varsayılan olarak etkindir. Flutter ekibi, uygulamaları Impeller'da test etmeyi ve sorunları bildirmeyi önerir. Skia'ya dönmek için Info.plist dosyasında Impeller bayrağını kullanın: FlutterEnableImpeller = NO. Flutter Team'e göre, iOS uygulamalarının %92'si görünür gerileme olmadan Impeller'da çalışır ve animasyon performansı %25–40 oranında iyileşir.
Android'de Impeller, Vulkan aracılığıyla çalışır. Etkinleştirmek için AndroidManifest.xml dosyasına io.flutter.embedded_views_preview meta etiketini ekleyin. Flutter ekibi, Impeller'ı çeşitli GPU mimarileri (Adreno, Mali, PowerVR) için optimize etmeye devam ediyor. Android'deki ana zorluk, Vulkan'ı olmayan cihazları (Android < 7.0 veya eski GPU'lar) desteklemektir. Bu tür cihazlar için Skia tabanlı bir yedek arka uç veya yazılım rasterleştirmeli Impeller kullanılacaktır.
Windows'ta Impeller, Direct3D 12 (Flutter Master'da etkin) aracılığıyla çalışır. macOS ve Linux'ta — sırasıyla Metal ve Vulkan aracılığıyla. Impeller, Web için planlanmamıştır çünkü Flutter'ın web sürümü CanvasKit (WebAssembly aracılığıyla Skia) kullanır ve tarayıcıdaki farklı gölgelendirici derleme mekanizması nedeniyle gölgelendirici takılması onun için kritik bir sorun değildir. Web sürümü Skia'yı kullanmaya devam edecektir.
Google, Impeller yol haritasını yayınladı: 2024 — iOS'ta varsayılan Impeller; 2025 — Android ve Windows'ta varsayılan Impeller; 2026 — Skia'nın Flutter Engine'den tamamen kaldırılması. Bundan sonra Flutter, Impeller'ı tek oluşturma motoru olarak kullanacak ve bu da bakımı basitleştirecek, motor boyutunu küçültecek ve tüm platformlarda performansı iyileştirecektir.
Sıkça Sorulan Sorular
iOS'ta Impeller, Flutter 3.16'dan itibaren varsayılan olarak etkindir. Android'de, AndroidManifest.xml dosyasına io.flutter.embedded_views_preview meta etiketini true değeriyle ekleyin. Windows'ta, başlatırken --enable-impeller bayrağını kullanın. Tüm durumlarda, Dart kodunda FlutterEngine aracılığıyla zorla etkinleştirilebilir.
Skia çalışır, ancak temel sorunları vardır: gölgelendirici takılması (gölgelendirici derlemede 50–200 ms gecikme), yüksek bellek tüketimi ve OpenGL mimari sınırlamaları. Impeller özellikle Flutter için tasarlanmıştır ve bu sorunları çevrimdışı gölgelendirici derleme ve bellek havuzları aracılığıyla çözer.
Evet, Impeller Skia ile aynı Canvas API'yi uygular. Metin, resim, animasyon, özel çizim gibi tüm standart Flutter widgets'ları değişiklik yapılmadan Impeller'da çalışır. Geriye dönük uyumluluk Flutter Engine düzeyinde sağlanır ve geçiş geliştirici için şeffaftır.
Hayır, bir uygulama aynı anda bir oluşturma motoru kullanır. Seçim, bir bayrak aracılığıyla Flutter Engine başlatılırken yapılır. Uygulama çalışması sırasında Skia ve Impeller arasında geçiş yapmak imkansızdır — oluşturucu, ilk FlutterEngine örneği oluşturulana kadar sabitlenir.
Skia, Chrome, Android ve diğer projeler için bağımsız bir Google kitaplığı olarak varlığını sürdürecek. Flutter'da Skia'nın yerini birincil oluşturucu olarak Impeller alacak. Skia, Flutter'ın web sürümü (CanvasKit aracılığıyla) ve Vulkan/Metal desteği olmayan cihazlar için yedek seçenek olarak kalacak.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.