Semua tulisan

Tulisan

Kapan Flutter perlu dibantu Rust

· 3 menit baca

Dart sudah cukup cepat untuk hampir semua kebutuhan aplikasi: UI, state, jaringan, penyimpanan. Tapi ada beberapa pekerjaan yang membuatnya kewalahan, dan dua di antaranya sering saya temui: mengolah gambar dan mengolah suara.

Untuk dua hal itu saya menulis plugin dengan inti Rust: ironpress untuk kompresi gambar dan flutter_audio_fx untuk efek suara real-time. Ini beberapa hal yang saya pelajari.

Tanda-tanda butuh Rust

Kalau tidak ada satu pun tanda itu, tetap di Dart. Menambah Rust berarti menambah toolchain, build, dan hal yang bisa rusak.

Jumlah panggilan lebih penting daripada kecepatan

Pelajaran terbesar dari ironpress: memanggil fungsi native lewat FFI itu murah, tapi bolak-balik antara Dart dan Rust tetap ada ongkosnya. Contohnya fitur "kompres sampai ukuran file maksimal sekian KB". Cara naifnya adalah mencoba kualitas di Dart, memanggil Rust, mengecek ukuran, lalu mengulang. Di ironpress, seluruh pencarian kualitasnya berjalan di dalam Rust, jadi Dart cukup memanggil sekali.

Untuk batch, saya pilih jalan tengah: Dart membagi pekerjaan per kelompok, lalu setiap kelompok diproses paralel di Rust. Hasilnya, progress dan pembatalan tetap bisa dikendalikan dari Dart dengan rapi, sementara pekerjaan beratnya tetap di native.

Di audio, aturannya lebih keras

flutter_audio_fx punya 14 efek, dari pitch shift dan auto-tune sampai peredam bising dan reverb. Aturan utamanya: tidak boleh ada alokasi memori di thread audio. Semua buffer disiapkan di depan, karena satu alokasi yang lambat di waktu yang salah langsung terdengar.

Rust sangat membantu di sini. Batasan seperti itu lebih mudah dijaga ketika compiler ikut mengawasi kepemilikan memori.

Jangan bebani pemakai plugin

Plugin dengan inti Rust tidak boleh memaksa pemakainya memasang Rust. Kedua plugin saya mengirim library native yang sudah dikompilasi untuk setiap platform, jadi bagi pemakainya rasanya sama seperti plugin Flutter biasa. Repot menyiapkan build untuk Android, iOS, Windows, macOS, dan Linux cukup ditanggung sekali oleh pembuatnya, bukan oleh setiap pemakai.

Ringkasnya

Kode keduanya terbuka di GitHub. Kalau kamu sedang mempertimbangkan Rust untuk aplikasi Flutter, saya senang diajak diskusi.