Meninggalkan pengembangan game dengan Rust setelah 3 tahun
(loglog.games)- Terhadap klaim bahwa semua masalah akan hilang jika sudah terbiasa dengan Rust
- Meski sudah terbiasa dengan Rust, masalah-masalah mendasarnya tidak hilang
- Game adalah state machine yang kompleks dan kebutuhannya terus berubah, sehingga tidak cocok dengan sifat Rust yang statis dan terlalu ketat dalam pemeriksaan
- Masalah harus terus-menerus me-refactor kode adalah sesuatu yang ditimbulkan sendiri
- Masalah refactor skala besar yang muncul karena borrow checker
- Rust memaksa refactor lebih sering daripada bahasa lain
- Dalam situasi ketika kebutuhan game sering berubah, kita jadi harus berhadapan dengan borrow checker dan perlu merestrukturisasi kode
- Sulit setuju dengan klaim bahwa refactor menghasilkan kode yang baik. Kode yang baik lahir dari mengulang ide dan mencobanya berkali-kali
- Indirection hanya menyelesaikan sebagian masalah dan menurunkan produktivitas pengembangan
- Jika memakai indirection untuk menyelesaikan isu borrow checker, logika kode jadi terpisah dan lebih kompleks
- Dalam game, ada event yang saling terhubung, timing tertentu, dan banyak state yang harus dikelola, dan indirection membuat hal ini lebih sulit
- Di Rust, bahkan kode sederhana pun harus ditulis bertele-tele demi indirection
- ECS(Entity-Component-System) menyelesaikan masalah yang salah
- Kelebihan ECS sebenarnya adalah kelebihan generational arena
- ECS dipandang dari berbagai sudut seperti dynamic composition, structure of arrays, solusi untuk borrow checker Rust, dynamically created generational arenas, dan lain-lain
- Namun, apakah ECS benar-benar pendekatan yang paling cocok dalam pengembangan game masih patut dipertanyakan. Perhatian seharusnya lebih diberikan pada logika game daripada performa atau composition
- Generalized systems tidak menghasilkan gameplay yang menyenangkan
- Jika memakai sistem yang terlalu digeneralisasi, gameplay yang tercipta menjadi membosankan
- Game yang bagus penting untuk merancang interaksi detail dengan hati-hati, menyinkronkan VFX, mengulang playtest dan eksperimen, lalu merilis cepat untuk mendapatkan umpan balik
- Rust mengejar nilai-nilai yang tidak cocok untuk prototyping cepat dan iterasi
- Yang penting dalam pengembangan game adalah prototyping dan iterasi yang cepat, tetapi nilai Rust justru kebalikannya
- Inti pengembangan game adalah game itu sendiri dan pengalaman bermain, bukan kode yang bebas crash
- Maintainability kode game bukan nilai yang terlalu penting untuk game indie. Yang penting adalah iteration speed
- Rust terlalu terobsesi menghindari masalah sampai malah melewatkan hal yang benar-benar penting
- Procedural macros jauh tertinggal dibanding reflection
- Dalam pengembangan game, kita harus menulis kode untuk berbagai area seperti system code, gameplay code, UI, VFX, audio, dan tools
- Di Rust, bahkan untuk "menampilkan objek" yang sederhana pun kita harus menulis kode sendiri atau membuat procedural macros
- Procedural macros jauh lebih terbatas dibanding macro deklaratif dan juga memakan waktu kompilasi lebih lama
- Reflection di C# sangat mudah digunakan dan memungkinkan pengembangan cepat ketika performa tidak terlalu penting
- Hot reloading berperan penting dalam meningkatkan kecepatan iterasi
- Hot reloading sangat berguna untuk UI/drawing mode instan, debugging, tuning konstanta gameplay, dan lain-lain
- Rust juga punya
hot-lib-reloader, tetapi tidak sempurna dan membutuhkan perencanaan serta antisipasi, sehingga membatasi penggunaan kreatif - Pengembang game menginginkan tooling tingkat tinggi yang lebih dari sekadar reload struct sederhana
- Abstraksi bukan pilihan, melainkan keharusan
- Contoh nyata) ketika perlu perilaku berbeda sesuai state UI, di Rust sering kali perlu refactor atau malah berlebihan memakai clone
- Sering kali kode diubah bukan karena business logic berubah, tetapi demi memuaskan compiler
- Rust tidak punya structural type system seperti "tipe dengan field-field ini", sehingga saat refactor kita harus mengubah banyak bagian kode
- Situasi GUI Rust adalah yang terburuk
- Dalam UI game, yang penting bukan data binding atau reactive update, melainkan kemampuan untuk mengustomisasi tampilan
- Yang dibutuhkan UI game adalah GUI yang cantik, sprite kustom, animasi, vector shape, partikel, efek, flash, dan lain-lain
- Saat ini belum ada library Rust yang benar-benar khusus untuk GUI game
- Orphan rule seharusnya opsional
- Orphan rule sangat menurunkan produktivitas pengembangan demi keamanan
- Dalam application code, bukan library, seharusnya ada opsi untuk mematikan orphan rule
- Waktu kompilasi memang membaik, tetapi tetap lambat jika memakai proc macros
- Proc macros seperti
serdesangat meningkatkan waktu kompilasi - Dalam incremental build yang memakan 20-30 detik atau lebih, tuning detail menjadi sangat sulit
- Proc macros seperti
- Ekosistem pengembangan game Rust terasa terlalu dibesar-besarkan
- Tidak banyak orang yang benar-benar membuat game nyata
- Banyak proyek yang situs web atau README-nya terlihat mewah dan terkenal, padahal kenyataannya tidak begitu
- Jika ingin benar-benar membuat game, penulis merekomendasikan
godot-rust. Daripada terobsesi dengan solusi pure Rust, lebih baik memanfaatkan engine yang matang
- Karena game bersifat single-threaded, alasan global state tidak nyaman jadi keliru
- Di Rust, memakai global state sangat tidak nyaman (
static mut,AtomicRefCell,Rc, dan lain-lain) - Namun, berbeda dari layanan backend, game pada dasarnya berjalan single-threaded sehingga ketidaknyamanan itu sebenarnya tidak diperlukan
- Penulis menganggap Bevy keliru memperkenalkan sistem paralel. Itu dilakukan demi performa tinggi, tetapi justru menambah kerepotan karena pengguna harus terus-menerus menentukan urutan eksekusi
- Di Rust, memakai global state sangat tidak nyaman (
- Dynamic borrow checking menyebabkan crash tak terduga setelah refactor
- Selama 2 tahun memakai
hecs, penulis sering melihat kasus crash akibat query yang saling bertumpuk - Saat memakai
RefCell, jika.borrow_mut()dipanggil di dua tempat, crash tak terduga juga bisa terjadi - Bukan berarti kodenya buruk, melainkan Rust memaksa refactor yang sebenarnya tidak perlu
- Dalam game,
RefCellberguna, tetapi Rust membuatnya terlalu sulit digunakan
- Selama 2 tahun memakai
- Fleksibilitas objek context kurang memadai
- Karena sulit memakai global state di Rust, sering dipakai pola mengumpulkan referensi ke dalam objek context lalu meneruskannya
- Namun, saat hanya ingin meminjam sebagian field, sering muncul error kompilasi karena partial borrow
- Orang mungkin menyarankan memecah context dan mengubah strukturnya, tetapi ketika yang ingin dikerjakan adalah logika game, mengubah struktur demi memuaskan compiler hanyalah buang waktu
Kelebihan Rust
- Jika sudah berhasil dikompilasi, biasanya akan berjalan dengan baik. Terutama berguna untuk tool CLI, pemrosesan data, atau penulisan algoritme
- Menunjukkan performa yang baik tanpa banyak usaha. Ada pengalaman bahwa Rust sekitar 1,5~2,5 kali lebih cepat daripada C#
- Enum diimplementasikan dengan baik
- Berkat Rust analyzer, kegunaan IDE meningkat sangat besar
- Sistem trait disusun dengan baik. Jika orphan rule sedikit dilonggarkan, kegunaannya akan jauh lebih tinggi
Pendapat GN⁺
-
Meski pendapat tentang Rust dalam artikel ini cenderung negatif, karena ini adalah kesimpulan yang diambil penulis setelah mencoba banyak hal, rasanya perlu diterima dengan serius. Khususnya dalam domain pengembangan game, kritik bahwa kepraktisan dan kecepatan pengembangan sangat penting, sementara Rust masih kurang di sisi itu, cukup masuk akal
-
Saya setuju bahwa keamanan yang dikejar Rust kadang bisa sangat menurunkan produktivitas pengembangan. Saat menulis kode Rust, sering kali lebih banyak waktu dihabiskan untuk memuaskan compiler daripada logika itu sendiri, dan ini tampaknya berasal dari fakta bahwa Rust pada dasarnya adalah bahasa yang dioptimalkan untuk system programming
-
Di sisi lain, pengembangan game umumnya berada di lingkungan single-threaded dan merupakan bidang yang menekankan prototyping cepat serta iterasi, sehingga pemeriksaan keamanan yang berlebihan justru bisa menjadi racun. Khususnya, saya sudah sering mendengar pengalaman orang-orang yang mencoba membuat game dengan Rust pada masa awal lalu menyerah, dan tampaknya masalah-masalah mendasar itu masih belum banyak membaik
-
Tentu saja engine game yang lebih baru seperti Bevy telah meningkatkan kenyamanan pengembangan game dengan Rust, tetapi tampaknya masih jauh dari tingkat kematangan engine seperti Unity atau Godot. Seperti pada tulisan ini, daripada membangun semuanya secara pure dengan Rust, menggunakan Rust bersama engine yang sudah ada bisa menjadi alternatif yang realistis
-
Kelebihan yang disebut penulis akan terasa jauh lebih kuat saat Rust digunakan di bidang lain selain game. Terutama di area seperti system programming atau pengembangan web server, keamanan dan performa tinggi Rust menjadi senjata besar, tetapi kelebihan-kelebihan itu tampaknya tidak memberi nilai tambah sebesar itu dalam pengembangan game
-
Pada akhirnya, Rust bukan bahasa serba bisa melainkan bahasa yang dioptimalkan untuk domain tertentu, jadi sebaiknya dipertimbangkan dengan hati-hati apakah cocok dengan karakter proyek yang sedang dikerjakan
13 komentar
Saya pikir Rust adalah bahasa yang ditujukan untuk mengatasi berbagai masalah yang muncul akibat beragam fault dari developer, di tengah semakin sedikitnya developer yang bisa menulis kode dengan integritas di level core.
Karena lebih cocok untuk pengembangan yang akurat daripada pengembangan yang cepat,
bahasa ini tidak cocok untuk proyek yang sering menerima permintaan tambahan dari pengguna dan harus segera dieksekusi.
Meski begitu, alasan orang tetap berharap akan hadirnya library UI
mungkin karena ada ekspektasi bahwa bahkan UI yang kecil dan sederhana pun, jika berjalan di atas kode yang kokoh, akan membuatnya jauh lebih berguna.
Saya sendiri belum pernah mengembangkan game jadi tidak terlalu tahu,
namun sepertinya dari awal salah memilih bahasa, (kalau iterasi pengembangan itu penting, seharusnya memilih bahasa tingkat skrip..)
atau tidak punya pemahaman yang mendalam tentang sistem.
Bahkan kalau memilih C++, saya rasa mungkin akan menghadapi masalah yang mirip.
Benar. Kalau memilih C++, memang ada opsi seperti Unreal...
Belakangan ini saya merasa bahwa di era sekarang, bahasa native seperti Rust dan C++ tampaknya lebih cocok untuk pengembangan middleware seperti game engine daripada pengembangan klien game. Sama seperti hampir tidak ada kasus pengembangan web full-stack dengan bahasa native.
Memang sejak awal itu bahasa yang dibuat untuk tujuan seperti itu. Sebagai pengganti C++.
Sepertinya tulisannya jadi terdengar seperti mengkritik bahasanya.
Betul. Awalnya memang dimulai untuk meningkatkan engine internal Firefox, ya?
Isi tulisannya terasa seperti mencoba mengembangkan di bidang yang kurang cocok dengan Rust seolah-olah itu obat mujarab untuk segala hal, lalu jadi kerepotan, haha
Saya 100% setuju. Untuk logika game, bahasa yang produktivitasnya tinggi tampak lebih cocok untuk kasus penggunaan tersebut.
Saya agak bisa relate karena masih berada di tahap mulai belajar Rust.
Perubahan pada borrowing membuat terlalu banyak kode harus diubah, jadi terasa menyiksa.
Berbeda dengan Python dan JavaScript yang punya banyak ekspresi implisit, Rust cenderung eksplisit sehingga kadang menghasilkan kode yang bertele-tele, dan karena memaksa programmer membuat banyak pilihan, rasanya juga melelahkan.
Meski begitu, konsep-konsep yang tidak ada di bahasa lain terasa segar dan menyenangkan.
Kalau tidak ada Rust Analyzer atau GitHub Copilot, sepertinya saya sudah menyerah lebih awal.
Pengembangan game memang hardcore ya...
Daripada menulis semuanya dari inti sampai front-end dengan Rust,
bagaimana kalau seperti Unity atau game engine lainnya, inti ditulis dengan Rust lalu digabungkan dengan bahasa yang lebih produktif untuk digunakan?
Sepertinya memang tidak terhindarkan, karena ada sisi yang sangat memaksakan kerangka tertentu.
Opini Hacker News
Membagikan pengalaman mengembangkan klien metaverse sambil memaparkan berbagai masalah Rust
Sebagai pengembang game dengan pengalaman 20 tahun, ia menilai Rust tidak cocok untuk pengembangan game
Ekosistem pengembangan game Rust bergantung pada hype berlebihan
Membandingkan pengalaman pengembangan game dengan Bevy, Unity, dan Godot
Bahasa Nim mungkin lebih cocok untuk pengembangan game daripada Rust
Rust tampak seperti bahasa yang dogmatis dan memaksakan gaya pemrograman tertentu
Demo tooling Allen Blomquist menunjukkan bahwa loop umpan balik pengembangan itu penting
Masalah mendasar Rust adalah meninggalkan pemrograman berorientasi objek dan lebih menyukai pemrograman fungsional
Dalam pengembangan game, Rust adalah pilihan terburuk
Saat menulis kode dengan bahasa D, ia menyadari bahwa mengubah layout data jauh lebih mudah dibandingkan C