29 puan yazan GN⁺ 2024-04-27 | 13 yorum | WhatsApp'ta paylaş
  • 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-reloader olsa 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ş
    • serde gibi 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, Rc vb.)
    • 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ı
  • Dinamik borrow checking, refactor sonrasında beklenmedik çöküşlere yol açıyor
    • hecs 2 yıl kullanılırken çakışan query’lerin çöküşe yol açtığı birçok durum görülmüş
    • RefCell kullanı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 RefCell faydalı 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

 
coremaker 2024-04-29

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.

 
kandk 2024-04-29

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.

 
cosine20 2024-04-29

Evet. Tabii ki C++ seçilmiş olsaydı Unreal diye bir seçenek de olurdu...

 
cosine20 2024-04-29

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.

 
kandk 2024-04-29

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.

 
cosine20 2024-04-29

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

 
mammal 2024-04-29

%100 katılıyorum. Oyun mantığı için, üretkenliği yüksek bir dil kullanım senaryosuna daha uygun görünüyor.

 
edunga1 2024-04-28

Rust’a yeni başlayan biri olarak biraz empati kurabiliyorum.
borrowing değişiklikleri yüzünden kodda aşırı fazla düzenleme yapmak zorunda kalmak gerçekten yorucuydu.
Python ve JavaScript’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 Analyzer ya da GitHub Copilot olmasaydı muhtemelen çok daha erken vazgeçerdim.

 
botplaysdice 2024-04-28

Oyun geliştirme gerçekten de hardcore bir işmiş...

 
steamb23 2024-04-28

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?

 
bus710 2024-04-28

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.

 
[Bu yorum gizlendi.]
 
GN⁺ 2024-04-27
Hacker News görüşü

Metaverse istemcisi geliştirme deneyimini paylaşarak Rust’ın sorunlarını ortaya koyuyor

  • Rust ile büyük ölçekli 3D oyun geliştirme örneği neredeyse yok
  • Refactoring ve programın farklı bölümlerini birbirine bağlama işi sancılı
  • Rendering neredeyse yeterli olsa da stack tamamlanmış değil ve güvenilir değil
  • 2D GUI sistemi zayıf ve her diyalog kutusu için fazla fazla kod gerekiyor
  • async sisteminin gereksiz alanlara kadar yayılması sorununa katılıyor

20 yıllık bir oyun geliştiricisi olarak Rust’ın oyun geliştirme için uygun olmadığını düşünüyor

  • Gameplay kodu esnek olmalı ve ilginç oyunlar yapmak için çok sayıda edge case barındırmalı
  • Derleme süresi önemli ve yapısal değişiklikler sık sık gerekli
  • ECS bazı sistemlerde faydalı olsa da gameplay veya UI kodunda kullanmak zor

Rust oyun geliştirme ekosistemi abartıya dayanıyor

  • Rust ile oyun geliştirmeyi denedi ama anında korkunç bir deneyim yaşadı
  • Yavaş derleme süreleri, devasa paket indirmeleri, Rust’ın kendisinin zorluğu vb.
  • Diğer araçların Rust kadar güvenli olmadığını söylüyorlar ama oyunlarda bellek güvenliği neredeyse hiç büyük bir sorun olmadı

Bevy ve Unity ile kapsamlı oyun geliştirme deneyimini karşılaştırıyor

  • Şu anda Rust ile oyun geliştirmeyi seçmek anlaşılması zor
  • Her şeyi ECS’ye sıkıştırmak eğlenceli gameplay geliştirmeyi engelliyor
  • Modern PC’lerin performansı düşünüldüğünde çoklu iş parçacığı optimizasyonu konusunda aşırı endişelenmeye gerek yok

Nim dili Rust’tan daha uygun olabilir oyun geliştirme için

  • Geliştiricinin önünü kesmiyor ve hot reloading destekliyor

Rust, belirli bir programlama tarzını dayatan dogmatik bir dil gibi görünüyor

  • Bellek güvenliğini her şeyin üstünde tutuyor, ancak bu oyun geliştirmede pek faydalı değil
  • Oyun geliştirme için ideal dil; üretkenliği yüksek, performansı yeterli ve risk alabilen yetkin programcılar için olmalı

Allen Blomquist’in tooling demosu, geliştirme geri bildirim döngüsünün önemli olduğunu gösteriyor

  • Rust istenen çalışma ortamını sağlayamadığı için yeniden Unity’ye geçti

Rust’ın temel sorunu, nesne yönelimini bırakıp fonksiyonel programlamayı tercih etmesi

  • En alt seviye çekirdekte yardımcı olabilir ama üst seviyede uygun değil

Oyun geliştirmede Rust en kötü seçim

  • Rust’ın doğruluk, güvenlik ve kusursuz kod arayışına dayalı değerleri oyun geliştirme ile uyuşmuyor
  • Oyunların ömrü kısa ve geliştirme döngüsü de kısa, bu yüzden kod kalitesi o kadar önemli değil
  • Oyun motoru geliştirmede faydalı olabilir ama yüksek esnekliğe sahip bir scripting diliyle birlikte kullanılmalı

D diliyle kod yazarken, veri yerleşimini değiştirmenin C’ye kıyasla çok daha kolay olduğunu fark etti

  • Referans tipleri ile değer tipleri arasında geçiş yapmak C’de zor, D’de ise kolay