Impeller adalah mesin rendering modern untuk Flutter, dikembangkan oleh Google untuk menggantikan Skia dan mengatasi masalah fundamentalnya: lag shader (jank) saat rendering frame pertama, konsumsi memori yang tinggi, dan kesulitan mendukung backend grafis yang berbeda. Tidak seperti Skia, Impeller mengompilasi shader terlebih dahulu (offline), menggunakan SPIR-V sebagai representasi perantara, dan bekerja langsung dengan Vulkan, Metal, dan Direct3D 12. Menurut data dari Flutter Team (2025), Impeller menghilangkan hingga 95% lag shader, memberikan 60 FPS yang dapat diprediksi bahkan pada perangkat kelas entry-level.
Poin utama
Impeller — adalah mesin rendering grafis sumber terbuka yang ditulis dalam C++, yang dikembangkan oleh tim Flutter untuk menggantikan Skia sebagai renderer utama. Proyek ini diumumkan pada tahun 2021 sebagai respons terhadap masalah shader jank yang sudah berlangsung lama yang dialami Skia. Impeller bukanlah fork dari Skia — ini adalah implementasi yang sepenuhnya baru, dirancang dengan mempertimbangkan keterbatasan GPU mobile dan API grafis modern.
Ide utama Impeller adalah memindahkan kompilasi shader ke tahap pembangunan (build) aplikasi, bukan saat runtime. Di Skia, shader dikompilasi saat penggunaan pertama, ketika pengguna sudah berinteraksi dengan aplikasi. Impeller mengompilasi semua shader terlebih dahulu (offline), mengemasnya ke dalam format biner SPIR-V, dan mengirimkannya bersama aplikasi. Saat runtime, Impeller memuat shader yang telah dikompilasi sebelumnya, yang menghilangkan penundaan terkait kompilasi.
Impeller juga memecahkan masalah konsumsi memori. Skia membuat banyak objek sementara (tekstur, buffer) dalam proses rendering, yang menyebabkan fragmentasi memori pada perangkat dengan sumber daya terbatas. Impeller menggunakan kumpulan memori (memory pools) dan menggunakan kembali sumber daya yang telah dialokasikan, mengurangi konsumsi memori puncak sebesar 30–40%.
SPIR-V (Standard Portable Intermediate Representation) — adalah representasi perantara shader yang dikembangkan oleh Khronos Group. Impeller menggunakan SPIR-V sebagai format universal untuk semua shader. Pada tahap build, shader dalam bahasa Impeller (DSL C++ khusus untuk mendeskripsikan efek) dikompilasi ke SPIR-V. Saat runtime, SPIR-V dimuat dan diterjemahkan ke format khusus platform — MSL untuk Metal, GLSL untuk Vulkan, atau DXIL untuk Direct3D 12.
Arsitektur Impeller terdiri dari beberapa lapisan, masing-masing menjalankan tugas yang ditentukan secara ketat: pemrosesan daftar perintah rendering, pengelolaan sumber daya GPU, dan eksekusi shader. Modularitas ini memungkinkan penambahan dukungan untuk API grafis baru dengan mudah.
Lapisan bawah — adalah abstraksi di atas API grafis (Vulkan, Metal, Direct3D 12). Impeller tidak mendukung OpenGL, karena OpenGL tidak menyediakan kemampuan untuk kompilasi offline shader yang efisien. Pada tingkat ini diimplementasikan: pengelolaan buffer vertex, pembuatan dan caching pipeline (jalur pipa grafis), sinkronisasi GPU. Pipeline di Impeller — adalah status GPU yang telah dikompilasi sebelumnya yang mencakup shader, pengaturan rasterisasi, dan blending. Semua pipeline dibuat pada tahap inisialisasi, yang menghilangkan kompilasi selama rendering.
Lapisan tengah — adalah sistem manajemen sumber daya. Ia mengalokasikan dan menggunakan kembali sumber daya GPU: tekstur, buffer, sampler. Alih-alih membuat tekstur baru setiap frame, Impeller mempertahankan kumpulan tekstur dengan berbagai ukuran dan format. Kumpulan memori secara otomatis mengembalikan sumber daya yang tidak digunakan dan dapat diperluas sesuai kebutuhan, tetapi tanpa fragmentasi yang menjadi ciri khas Skia.
Lapisan atas — adalah graf rendering tempat Flutter Engine mengubah perintah Canvas API. Impeller menerima Display List (daftar perintah menggambar) dan membangun graf ketergantungan operasi darinya. Graf dioptimalkan: jalur rendering yang tidak perlu dihapus, operasi dengan status GPU yang sama digabungkan. Kemudian graf dikompilasi menjadi serangkaian panggilan Vulkan/Metal menggunakan pipeline yang telah dibuat sebelumnya.
Setiap frame melewati jalur tetap: Display List → graf rendering → kompilasi graf → pengiriman perintah GPU. Jalur tambahan dapat ditambahkan untuk efek pasca-pemrosesan (blur, bayangan) atau persiapan buffer kedalaman. Waktu frame di Impeller lebih dapat diprediksi daripada di Skia, karena tidak ada penundaan non-deterministik untuk kompilasi shader.
Perbandingan Impeller dan Skia menunjukkan perbedaan dalam pendekatan rendering. Skia — adalah pustaka 2D universal untuk keperluan umum, sementara Impeller — adalah mesin khusus untuk Flutter, dioptimalkan untuk kebutuhan UI mobile.
| Parameter | Skia | Impeller |
|---|---|---|
| Shader | Kompilasi saat runtime | Kompilasi offline (build time) |
| Shader jank | 50–200 ms untuk frame pertama | Tidak ada (0 ms) |
| Format shader | Proprieter (SkSL) | SPIR-V (universal) |
| Backend GPU | OpenGL, Vulkan, Metal | Vulkan, Metal, Direct3D 12 |
| Konsumsi memori | Tinggi (tekstur sementara) | Kumpulan memori, hingga -40% |
| Platform | Android, iOS, Web, Desktop | Android, iOS, Desktop |
| Status | Stabil (utama) | Preview (menggantikan Skia) |
Perbedaan utama — pendekatan terhadap shader. Skia mengompilasi shader pada saat penggunaan, menciptakan shader jank pada rendering pertama efek yang tidak dikenal. Impeller menghilangkan ini melalui kompilasi offline. Skia juga mendukung OpenGL, yang diperlukan untuk versi web Flutter, tetapi Impeller meninggalkan OpenGL demi API yang lebih modern, yang memberikan performa lebih baik pada perangkat mobile.
Untuk aplikasi Flutter, peralihan ke Impeller tidak memerlukan perubahan kode. Impeller mengimplementasikan Canvas API yang sama dengan Skia, sehingga semua widget, animasi, dan gambar kustom berfungsi sama. Kompatibilitas mundur dijamin pada tingkat Flutter Engine — mesin memilih renderer (Skia atau Impeller) pada tahap inisialisasi aplikasi.
Impeller memberikan beberapa keunggulan terukur dibandingkan Skia yang secara langsung memengaruhi pengalaman pengguna dan performa aplikasi Flutter.
Shader jank — masalah utama Skia yang dipecahkan sepenuhnya oleh Impeller. Ketika aplikasi Flutter menampilkan layar baru dengan gradien, mask, atau blend tidak standar, Skia mengompilasi shader selama animasi, yang menyebabkan frame terlewat. Impeller mengompilasi semua shader pada tahap build, sehingga frame pertama dirender sama cepatnya dengan frame berikutnya. Pada perangkat dengan GPU lambat (MediaTek Helio, Qualcomm 400 series) perbedaannya sangat terlihat — hingga 200 ms penundaan untuk setiap jenis efek baru di Skia dibandingkan 0 ms di Impeller.
Impeller menggunakan kumpulan sumber daya untuk mengelola memori GPU. Di Skia, setiap frame dapat membuat tekstur baru untuk permukaan sementara, terutama saat rendering dengan transparansi atau menggunakan saveLayer. Impeller menggunakan kembali tekstur antar frame, yang mengurangi konsumsi memori puncak sebesar 30–40% di Android dan hingga 25% di iOS. Ini sangat penting untuk aplikasi dengan daftar panjang dan animasi, di mana Skia dapat menyebabkan kesalahan OOM pada perangkat dengan RAM 2 GB.
Di Skia, waktu rendering frame dapat bervariasi tergantung pada shader mana yang telah dikompilasi. Frame pertama dengan efek baru dapat memakan waktu 50–200 ms, sementara frame berikutnya — 3–5 ms. Ketidakpastian ini mempersulit optimasi dan pengujian. Impeller memastikan waktu frame yang seragam karena semua shader sudah dikompilasi dan alokasi memori dapat diprediksi. Flutter Engine dengan Impeller dapat menghitung anggaran waktu untuk setiap frame dengan lebih akurat.
Impeller bekerja langsung dengan Vulkan (Android), Metal (iOS), dan Direct3D 12 (Windows), tanpa lapisan OpenGL. Ini memberikan beberapa keunggulan: latensi driver yang lebih rendah (hingga 50% lebih sedikit dibandingkan melalui OpenGL), kontrol langsung atas memori GPU, dan akses ke kemampuan modern (arsitektur GPU berbasis tile, GPU-driven rendering). OpenGL tidak lagi dikembangkan dan driver-nya pada perangkat mobile sering menjadi hambatan performa.
Impeller sedang dalam pengembangan aktif dan tersedia di saluran Flutter Master dan Beta. Mulai Flutter 3.16, Impeller diaktifkan secara default di iOS, dan di Android — opsional melalui flag konfigurasi. Penggantian penuh Skia dengan Impeller diharapkan dalam salah satu rilis stabil Flutter tahun 2026.
Di iOS, Impeller bekerja melalui Metal dan diaktifkan secara default sejak Flutter 3.16. Tim Flutter merekomendasikan pengujian aplikasi di Impeller dan melaporkan masalah. Untuk kembali ke Skia, gunakan flag Impeller di file Info.plist: FlutterEnableImpeller = NO. Menurut data Flutter Team, 92% aplikasi di iOS berjalan di Impeller tanpa regresi yang terlihat, dan performa animasi meningkat 25–40%.
Di Android, Impeller bekerja melalui Vulkan. Untuk mengaktifkannya, tambahkan meta-tag di AndroidManifest.xml: io.flutter.embedded_views_preview. Tim Flutter terus mengoptimalkan Impeller untuk berbagai arsitektur GPU (Adreno, Mali, PowerVR). Tantangan utama di Android adalah dukungan untuk perangkat tanpa Vulkan (Android < 7.0 atau GPU lama). Untuk perangkat semacam itu, akan digunakan backend cadangan di Skia atau Impeller dengan rasterisasi perangkat lunak.
Di Windows, Impeller bekerja melalui Direct3D 12 (diaktifkan di Flutter Master). Di macOS dan Linux — masing-masing melalui Metal dan Vulkan. Untuk Web, Impeller tidak direncanakan, karena versi web Flutter menggunakan CanvasKit (Skia melalui WebAssembly), dan shader jank bukanlah masalah kritis karena mekanisme kompilasi shader yang berbeda di browser. Versi web akan terus menggunakan Skia.
Google telah menerbitkan peta jalan Impeller: 2024 — Impeller default di iOS; 2025 — Impeller default di Android dan Windows; 2026 — penghapusan total Skia dari Flutter Engine. Setelah itu, Flutter akan menggunakan Impeller sebagai satu-satunya mesin rendering, yang akan menyederhanakan dukungan, mengurangi ukuran mesin, dan meningkatkan performa di semua platform.
Pertanyaan yang sering diajukan
Di iOS, Impeller diaktifkan secara default sejak Flutter 3.16. Di Android, tambahkan meta-tag io.flutter.embedded_views_preview dengan nilai true di AndroidManifest.xml. Di Windows, gunakan flag --enable-impeller saat menjalankan. Dalam semua kasus, dapat diaktifkan secara paksa melalui FlutterEngine di kode Dart.
Skia berfungsi, tetapi memiliki masalah fundamental: shader jank (50–200 ms penundaan untuk kompilasi shader), konsumsi memori tinggi, dan keterbatasan arsitektur OpenGL. Impeller dirancang khusus untuk Flutter dan mengatasi masalah ini melalui kompilasi offline shader dan kumpulan memori.
Ya, Impeller mengimplementasikan Canvas API yang sama dengan Skia. Semua widget standar Flutter — teks, gambar, animasi, paint kustom — berfungsi di Impeller tanpa perubahan. Kompatibilitas mundur dijamin pada tingkat Flutter Engine dan transisi ini transparan bagi pengembang.
Tidak, aplikasi menggunakan satu mesin rendering pada satu waktu. Pemilihan dilakukan saat inisialisasi Flutter Engine melalui flag. Peralihan antara Skia dan Impeller selama runtime aplikasi tidak mungkin — renderer ditetapkan sebelum instance pertama FlutterEngine dibuat.
Skia akan terus ada sebagai pustaka independen Google untuk Chrome, Android, dan proyek lainnya. Di Flutter, Skia akan digantikan oleh Impeller sebagai renderer utama. Skia akan tetap digunakan untuk versi web Flutter (melalui CanvasKit) dan sebagai opsi cadangan untuk perangkat tanpa dukungan Vulkan/Metal.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga