Rust ile 3 yıl oyun geliştirdikten sonra bırakmak
(loglog.games)- Rust’a alışınca tüm sorunların ortadan kalkacağı iddiası hakkında
- Rust’a alışsanız da temel sorunlar ortadan kalkmıyor
- Oyunlar karmaşık durum makineleridir ve gereksinimler sürekli değiştiği için Rust’ın statik ve aşırı denetleyici doğasıyla uyuşmuyor
- Kodu sürekli refactor etme sorunu kendi kendine yaratılmış bir sorun
- Borrow checker nedeniyle ortaya çıkan büyük ölçekli refactor sorunları
- Rust, diğer dillere göre daha sık refactor yapmayı zorluyor
- Oyun gereksinimlerinin sık değiştiği durumlarda borrow checker ile mücadele ediliyor ve kodun yeniden yapılandırılması gerekiyor
- Refactor’un iyi kod ürettiği iddiasına katılmak zor. İyi kod, fikirleri tekrar tekrar deneyip yineleyerek ortaya çıkar
- Dolaylılaştırma (Indirection) yalnızca bazı sorunları çözüyor ve geliştirme verimliliğini düşürüyor
- Borrow checker sorunlarını çözmek için dolaylılaştırma kullanıldığında kod mantığı bölünüyor ve karmaşıklaşıyor
- Oyunlarda bağlantılı olaylar, belirli zamanlamalar ve çok sayıda durum yönetimi gerekir; dolaylılaştırma bunu zorlaştırır
- Rust’ta basit kod bile dolaylılaştırma uğruna gereksiz derecede uzun yazılmak zorunda kalır
- ECS(Entity-Component-System) yanlış problemi çözüyor
- ECS’nin avantajları aslında generational arena’nın avantajları
- ECS’ye dynamic composition, structure of arrays, Rust borrow checker çözümü, dynamically created generational arenas gibi çeşitli açılardan bakılıyor
- Ancak oyun geliştirmede ECS’nin en uygun yaklaşım olup olmadığı şüpheli. Performans ya da composition’dan çok oyun mantığına odaklanmak gerekiyor
- Genelleştirilmiş sistemler (Generalized systems) eğlenceli oynanışa yol açmıyor
- Aşırı genelleştirilmiş sistemler sıkıcı oynanış üretiyor
- İyi oyunlarda ayrıntılı etkileşimler dikkatle tasarlanmalı, VFX senkronize edilmeli, playtest ve deneyler tekrarlanmalı, hızlı çıkış yapılıp geri bildirim alınmalı
- Rust, hızlı prototipleme ve yineleme için uygun olmayan değerlere öncelik veriyor
- Oyun geliştirmede önemli olan hızlı prototipleme ve yineleme iken Rust’ın değerleri bunun tersine düşüyor
- Oyun geliştirmenin özü, oyunun kendisi ve oyuncu deneyimidir; çökmesiz kod değil
- Oyun kodunun sürdürülebilirliği indie oyunlarda çok da önemli bir değer değil. Önemli olan yineleme hızı
- Rust, sorunlardan kaçınmaya fazla takılıp asıl önemli olanı kaçırıyor
- Procedural macros, reflection’ın çok gerisinde kalıyor
- Oyun geliştirmede sistem kodu, oynanış kodu, UI, VFX, ses, araçlar gibi birçok alanda kod yazmak gerekir
- Rust’ta basit bir “nesne çıktısı” için bile ya doğrudan kod yazmak ya da procedural macros üretmek gerekir
- Procedural macros, declarative macro’lara göre çok daha kısıtlıdır ve derleme süresi daha uzundur
- C# reflection çok kolay kullanılır ve performansın kritik olmadığı durumlarda hızlı geliştirme sağlar
- Hot reloading, yineleme hızını artırmada önemli rol oynar
- Hot reloading; immediate mode UI/çizim, debugging, oynanış sabitlerini ayarlama gibi işlerde çok kullanışlıdır
- Rust’ta
hot-lib-reloaderolsa da kusursuz değildir; planlama ve öngörü gerektirdiği için yaratıcı kullanımı sınırlar - Oyun geliştiricileri, basit struct yeniden yüklemenin ötesinde daha üst düzey tooling ister
- Soyutlama bir tercih değil, zorunluluktur
- Gerçek örnek: UI durumuna göre farklı davranış gerektiğinde Rust’ta refactor gerekir ya da aşırı clone kullanılır
- Çoğu zaman iş mantığı değiştiği için değil, derleyiciyi memnun etmek için kod değiştirilir
- Rust’ta “şu alanlara sahip tip” gibi yapısal bir type system olmadığından refactor sırasında kodun birçok yerini değiştirmek gerekir
- Rust’ın GUI durumu çok kötü
- Oyun UI’sinde önemli olan veri bağlama ya da reaktif güncellemeler değil, görünümü özelleştirebilmektir
- Oyun UI’sinin ihtiyacı güzel GUI, özel sprite’lar, animasyonlar, vektör şekiller, parçacıklar, efektler, flaşlar gibi şeylerdir
- Şu anda oyun GUI’sine özel bir Rust kütüphanesi yok
- Orphan rule isteğe bağlı olmalı
- Orphan rule, güvenlik uğruna geliştirme verimliliğini ciddi biçimde düşürüyor
- Kütüphane değil uygulama kodunda orphan rule kapatılabilmeli
- Derleme süreleri iyileşti ama proc macros kullanınca hâlâ yavaş
serdegibi proc macros derleme süresini ciddi biçimde artırıyor- 20-30 saniyeyi aşan incremental build sürelerinde ince ayar yapmak çok zorlaşıyor
- Rust oyun geliştirme ekosistemi abartılmış hissi veriyor
- Gerçekten oyun yapan insan sayısı çok fazla değil
- Web sitesi ya da README’si gösterişli ve ünlü görünen projelerin gerçekte öyle olmadığı sık görülüyor
- Gerçekten oyun yapmak istiyorsanız
godot-rustöneriliyor. Saf Rust çözümlerine takılmak yerine olgun bir motorun yardımını almak daha iyi
- Oyunlar tek iş parçacıklı olduğu için global state konusundaki rahatsızlık yanlış yere odaklanıyor
- Rust’ta global state kullanmak çok zahmetli (
static mut,AtomicRefCell,Rcvb.) - Ama oyunlar, backend servislerinin aksine çoğunlukla tek iş parçacıklıdır; bu kadar zahmet gereksizdir
- Bevy’nin paralel sistemleri benimsemesi bir hataydı deniyor. Performans için yapıldı ama kullanıcıların sürekli sıra belirtmesini gerektirerek işleri daha da zorlaştırdı
- Rust’ta global state kullanmak çok zahmetli (
- Dinamik borrow checking, refactor sonrasında beklenmedik çöküşlere yol açıyor
hecs2 yıl kullanılırken çakışan query’lerin çöküşe yol açtığı birçok durum görülmüşRefCellkullanırken de iki yerde.borrow_mut()çağrısı beklenmedik çöküşlere neden olabiliyor- Sorun kötü koddan çok, Rust’ın gereksiz refactor’u zorlaması
- Oyunlarda
RefCellfaydalı ama Rust bunu gereksiz yere zorlaştırıyor
- Context nesnelerinin esnekliği yetersiz
- Rust’ta global state kullanmak zor olduğu için context nesnesinde referanslar toplanıp aktarılıyor
- Ancak burada yalnızca bazı alanlar ödünç alınsa bile partial borrow yüzünden derleme hatası çıkabiliyor
- Context’i bölüp yapıyı değiştirmek önerilse de asıl yapılmak istenen oyun mantığıdır; derleyiciyi memnun etmek için yapıyı değiştirmek zaman kaybıdır
Rust’ın artıları
- Derlenince genelde iyi çalışıyor. Özellikle CLI araçları, veri işleme ve algoritma yazımında faydalı
- Fazladan çaba olmadan iyi performans veriyor. C#’a göre yaklaşık 1.5~2.5 kat daha hızlı olduğuna dair deneyim var
- Enum uygulaması başarılı
- Rust analyzer sayesinde IDE deneyimi büyük ölçüde iyileşti
- Trait sistemi güçlü. Orphan rule biraz gevşetilse çok daha kullanışlı olabilir
GN⁺ görüşü
-
Rust hakkındaki görüşler genel olarak olumsuz olsa da, yazarın çeşitli denemelerden sonra vardığı bir sonuç olduğu için ciddiye alınması gerekiyor gibi görünüyor. Özellikle oyun geliştirme gibi bir alanda pratiklik ve geliştirme hızının ne kadar önemli olduğu, Rust’ın ise bu alanlarda hâlâ eksik kaldığı yönündeki tespitler anlamlı
-
Rust’ın hedeflediği güvenliğin bazen geliştirme verimliliğini ciddi biçimde düşürebildiğine katılmak mümkün. Rust kodu yazarken bazen mantığın kendisinden çok derleyiciyi memnun etmeye zaman harcanıyor; bu da Rust’ın temelde sistem programlamaya odaklı bir dil olmasından kaynaklanıyor gibi görünüyor
-
Öte yandan oyun geliştirme çoğunlukla tek iş parçacıklı bir ortamda hızlı prototipleme ve yineleme gerektiren bir alan; bu yüzden aşırı güvenlik kontrolleri ters etki yaratabiliyor olabilir. Özellikle Rust’ın ilk dönemlerinde oyun geliştirmeyi deneyip hayal kırıklığı yaşayan birçok örnek duyulmuştu; anlaşılan temel sorunlar hâlâ büyük ölçüde çözülmüş değil
-
Elbette Bevy gibi son dönemde çıkan oyun motorları Rust ile oyun geliştirmeyi daha kullanışlı hâle getiriyor, ancak hâlâ Unity ya da Godot gibi olgun motorların seviyesinden oldukça uzaktalar. Bu yazıda da söylendiği gibi, her şeyi saf Rust ile yapmak yerine mevcut motorlarla birlikte kullanmak daha gerçekçi bir alternatif olabilir
-
Yazarın saydığı avantajlar, Rust’ı oyun dışındaki alanlarda kullanırken daha belirgin hissediliyor. Özellikle sistem programlama ya da web sunucusu geliştirme gibi alanlarda Rust’ın güvenliği ve yüksek performansı büyük bir avantaj; ancak bu avantajlar oyun geliştirmede o kadar güçlü bir değer önermesi sunmuyor gibi görünüyor
-
Sonuç olarak Rust her işe uyan bir dil değil, belirli alanlara daha uygun bir dil. Bu yüzden kendi projenizin niteliğine uygun olup olmadığını dikkatle değerlendirmek gerekiyor
13 yorum
Bence
rust, çekirdek seviyede bütünlüğü olan kod yazabilen geliştiricilerin azalmasıyla birlikte,çeşitli geliştirici hatalarından kaynaklanan sorunları çözmek için ortaya çıkmış bir dil.
Hızlı geliştirmekten ziyade,
doğru geliştirmeye daha uygun olduğu için,
kullanıcıdan ek taleplerin sık geldiği ve hızla yürütülmesi gereken projeler için uygun değil.
Buna rağmen UI kütüphanesi çıkmasını istememizin nedeni,
sağlam kodun üzerinde çalışan küçük ve sade bir UI bile olsa kullanım alanını daha da genişleteceğine dair beklenti sanırım.
Oyun geliştirme yapmadığım için çok bilmiyorum ama,
en baştan dili yanlış seçmiş gibi görünüyor, (geliştirme iterasyonu önemliyse script düzeyinde bir dil seçmeliydi..)
ya da sistem hakkında derin bir anlayışı yokmuş gibi.
C++ seçmiş olsaydı da benzer sorunlar yaşamaz mıydı diye düşünüyorum.
Evet. Tabii ki C++ seçilmiş olsaydı Unreal diye bir seçenek de olurdu...
Günümüzde Rust, C++ gibi native dillerin oyun istemcisi geliştirmekten ziyade oyun motoru gibi middleware geliştirmek için daha uygun olduğu düşüncesine kapılıyorum.
Tıpkı native dillerle full-stack web geliştiren örneklerin neredeyse hiç olmaması gibi.
Zaten en başından o amaç için ortaya çıkmış bir dil. C++'ın yerini almak için. Yazı sanki dili eleştiren bir yazıya dönüşmüş gibi.
Doğru. Başta Firefox’un dahili motorunu iyileştirmek için başlamıştı galiba?
Yazının içeriği, Rust’ı her derde deva bir şey gibi görüp aslında Rust’la pek uyuşmayan bir alanda geliştirme yapmaya çalışıp epey zorlanmış gibi bir his veriyor haha
%100 katılıyorum. Oyun mantığı için, üretkenliği yüksek bir dil kullanım senaryosuna daha uygun görünüyor.
Rust’a yeni başlayan biri olarak biraz empati kurabiliyorum.
borrowingdeğişiklikleri yüzünden kodda aşırı fazla düzenleme yapmak zorunda kalmak gerçekten yorucuydu.PythonveJavaScript’teki çok sayıdaki örtük ifadelerin aksine, Rust daha açık yazımı teşvik ettiği için bazen lafı uzayan kodlar ortaya çıkabiliyor; ayrıca programcıyı pek çok seçim yapmaya zorladığı için de yorucu olabiliyor.Buna rağmen, diğer dillerde olmayan kavramları taze ve eğlenceli geliyor.
Rust Analyzerya daGitHub Copilotolmasaydı muhtemelen çok daha erken vazgeçerdim.Oyun geliştirme gerçekten de hardcore bir işmiş...
Rust ile çekirdekten front-end'e kadar her şeyi yazmaktansa
Unity veya diğer oyun motorlarında olduğu gibi çekirdeği Rust ile yazıp, bunu üretkenliği yüksek bir dille birleştirerek kullanmak nasıl olur?
Sanırım yapısı gereği çerçeveyi oldukça katı biçimde dayatıyor, o yüzden kaçınılmaz sanırım.
Hacker News görüşü
Metaverse istemcisi geliştirme deneyimini paylaşarak Rust’ın sorunlarını ortaya koyuyor
20 yıllık bir oyun geliştiricisi olarak Rust’ın oyun geliştirme için uygun olmadığını düşünüyor
Rust oyun geliştirme ekosistemi abartıya dayanıyor
Bevy ve Unity ile kapsamlı oyun geliştirme deneyimini karşılaştırıyor
Nim dili Rust’tan daha uygun olabilir oyun geliştirme için
Rust, belirli bir programlama tarzını dayatan dogmatik bir dil gibi görünüyor
Allen Blomquist’in tooling demosu, geliştirme geri bildirim döngüsünün önemli olduğunu gösteriyor
Rust’ın temel sorunu, nesne yönelimini bırakıp fonksiyonel programlamayı tercih etmesi
Oyun geliştirmede Rust en kötü seçim
D diliyle kod yazarken, veri yerleşimini değiştirmenin C’ye kıyasla çok daha kolay olduğunu fark etti