2 puan yazan GN⁺ 2023-12-22 | 1 yorum | WhatsApp'ta paylaş

Moddio Oyun Motoru 2

  • Moddio, çok oyuncululuğu önceliklendiren bir oyun motorudur.
  • Sunucu otoritesine sahip ağ kodu, snapshot interpolation ve istemci tarafı uzlaştırma özelliklerini yerleşik olarak içerir.
  • Aylık 5 dolarlık bir VM üzerinde 50'den fazla eşzamanlı oyuncuyu veya 300'den fazla hareketli nesneyi destekler.

Demo

  • Kutudan çıkanlar: Box2D fizik motoru, sunucu otoritesine sahip ağ kodu, envanter ve öğe sistemi, yerleşik özellikler (HP, enerji vb.) ve yenilenme oranları, diyalog sistemi, mağaza, birim kontrolü, istemci tarafında tahmin edilen mermiler ve birim hareketi, birim yapay zekası ve A* yol bulma, mobil kontroller vb.

Oyunu çalıştırma

  • Node 18 veya üzeri gerekir.
  • Depoyu kurduktan sonra /src dizinine gidin, game-sample.json dosyasını game.json olarak yeniden adlandırın, ardından kök dizine dönüp sunucuyu çalıştırın.
  • Artık oyunu http://localhost:80 adresinde oynayabilirsiniz.

Sıfırdan yeni oyun oluşturma

  • Moddio oyunları, https://www.modd.io üzerinde sunulan Moddio oyun editörü kullanılarak oluşturulur ve düzenlenir.
  • Oyunu oluşturduktan sonra, yerel kurulumda kullanabileceğiniz bir game.json dışa aktarabilirsiniz.
  • Dışa aktarılan oyun JSON'unu game.json olarak yeniden adlandırın ve ./src dizinine taşıyın.

Katkıda bulunma

  • Moddio, MIT lisansı altında tamamen ücretsiz ve açık kaynaktır.
  • Katkıcı olma hakkında bilgi edinmek için katkıda bulunma sayfasını ziyaret edin.

Katkı sağlayanlar

  • Isogenic oyun motoru, Phaser, PlanckJS, uWebsocket, Box2D, Kenney varlıkları, Hero Icons ve diğerleri kullanılmıştır.

GN⁺ görüşü

  • Moddio oyun motoru, çok oyunculu oyun geliştirmeye odaklanır ve düşük maliyetle çok sayıda oyuncuyu destekleyen güçlü özellikler sunar.
  • Açık kaynak olması ve topluluk katkılarıyla sürekli gelişmesi sayesinde, başlangıç seviyesindeki yazılım mühendisleri için de erişilebilirdir.
  • Oyun geliştirmek için gereken çeşitli özellikler yerleşik olarak geldiğinden, geliştiricilere hızlı prototip oluşturma ve test etme ortamı sağlar.

1 yorum

 
GN⁺ 2023-12-22
Hacker News yorumları
  • Android uygulamasının kayıt ekranında Google kullanıcı adını ve parolasını, uygulamanın içindeki bir web formu gibi görünen yere girmemi istiyor; kullanıcının uygulamanın parolayı gözetleyip gözetlemediğini bilmesinin bir yolu yok.
    Genelde uygulamalar oturum açma ekranına yönlendirip sonra geri dönen bir akış kullanıyor gibi; bu kalıbı uygulamak zor mu merak ediyorum. Sorun çapraz platform desteğinden mi kaynaklanıyor, onu da merak ediyorum.

    • Prensipte çok zor bir iş değil. Otomobil üreticileriyle çalışırken kullanıcının OEM hesabıyla oturum açmasını sağlamamız gerekiyor; teoride hepsi uyumlu olduklarını söylüyor ama pratikte pek çok şey çalışmıyor ve düzeltmeler de uzun sürüyor.
      Yine de yukarıda söylenen yöntem gerçekten olmaması gereken bir şey; Google’ın bunu zaten yasakladığını sanıyordum.
    • Buna OAuth 2.0 deniyor; Okta gibi bir şey kullanırsanız uygulaması basit.
  • Kullanıcıların bir oyun motorunu benimsemesini sağlamak hiç kolay değil; özellikle de kapalı kaynak ise daha da zor.
    Sitedeki oyun galerisine bakınca şimdiye kadar epey iyi iş çıkarmış gibi görünüyor; bunu birkaç arkadaş mı yaptı, yoksa oldukça aktif bir topluluk mu var merak ediyorum.

    • İyi özellikler, öğrenme kolaylığı ve düşük giriş bariyerinin birleşimi epey ileri gidebilir.
      Günler, hatta sadece birkaç saatlik rahat bir uğraşla anlamlı sonuçlar alınabilen bir yapı düşünün. Flash’ı hatırlayın.
    • Aktif bir topluluk var ve her gün 150–300 yeni oyun yapılıyor.
      Hem oyun geliştiricileri hem de oyuncular için giriş bariyerinin düşük olması kesinlikle yardımcı oluyor. İndirme ya da kayıt gerekmiyor.
  • Sadece başlığa bakınca bunun modd.io olacağını düşünmemiştim. IO oyunları yapmak için kullanılan popüler bir framework/platform.

    • Çok oyun oynarım, eskiden oyun satmışlığım da var ama bu terimi hiç duymadım. IO oyunu nedir?
  • Brains sunucularından birine girip yaklaşık 50 oyunculuk deneyimin nasıl olduğunu merak ettim. WebSocket’lerden beklenebileceği gibi hareketler biraz teklemeliydi; ben de benzer bir şey yaptığım için ağ sıkıştırmasını da merak ettim.
    Yalnızca LZ-string sıkıştırmasının yeterli olup olmadığından emin değilim. 50 oyuncu için saniyede yaklaşık 20 KB kullanıyor; Warzone ise 150 oyuncuda saniyede sadece yaklaşık 48 KB kullanıyor. Sınırsız veri yoksa bulut bant genişliği maliyeti epey artabilir.
    Sıkıştırılmış bayt tamponunun 埒愑䣔橤㤰゙㟍稦獦ঙ惝䓇強栛䳌۬䌃̩佼 gibi görünmesi de ilginçti. LZ-string sıkıştırma çıktısı normalde böyle mi olur bilmiyorum ama oldukça yabancı görünüyor.
    Her hâlükârda potansiyel maliyetleri azaltmak için ağ tarafında geliştirilecek çok yer var. Projenin tamamı çok etkileyici ve iyi yapılmış bir iş.

    • Bizim WebSocket’lerde hareketler oldukça sıkı: https://gooberdash.winterpixel.io/
      Kilit nokta istemci tarafı tahmin ve rollback networking algoritması. Bizim oyun durumumuz 30 Hz’de yaklaşık 1 KB, yani genelde tek bir pakete sığıyor; bu yüzden WebSocket’ler de çok kötü değil. Elbette güvenilmez bir protokol daha iyi olurdu.
    • “WebSocket’lerden beklenebileceği gibi hareketler biraz teklemeliydi” kısmını biraz daha açıklayabilir misin? Birkaç “IO oyunu” oynadım; arada gecikmesi çok yüksek oyuncular dışında oldukça akıcı görünüyorlardı.
      Birkaç ay önce WebSocket’leri biraz test ettim; anladığım kadarıyla oyunlar gibi gecikmeye duyarlı iletişimde TCP kullanmanın ciddi dezavantajları var. TCP başlığı UDP’den 2 kattan fazla büyük, ek kontrol paketleri var ve eski veriler yeniden iletilirken yeni verilerin gönderimi gecikiyor. WebSocket’ler de TCP üzerinde çalıştığı için aynı dezavantajlara sahip.
      Buna rağmen insanlar TCP’nin WebSocket mesajlarının teslimini garanti ettiğini söylüyor ama paket kaybını yeniden üretebildim. Sonuçta dezavantajlar olduğu gibi duruyor; gerçekten garantili teslim gerekiyorsa bunun üzerine kendiniz bir şey inşa etmeniz gerekiyor. Madem öyle, en baştan UDP üzerinde yalnızca gereken mesajlar için bunu yapmak da mümkün olabilirdi.
      Ağ konusunda biraz kurcalamış olmak dışında neredeyse hiç bilgim ve deneyimim yok; bunu göz önünde bulundurun.
    • CJK karakterleri, yazdırılabilir Unicode karakterlerinin çok büyük bir bölümünü oluşturur. [1] En büyük iki blok U+3400~U+4DBF, U+4E00~U+9FFF aralıklarını içerir.
      Söz konusu dize \u57d2\u6111\u48d4\u6a64\u3930\u3099\u37cd\u7a26\u7366\u0999\u60dd\u44c7\u5f37\u681b\u4ccc\u06ec\u4303\u0329\u4f7c olarak decode ediliyor.
      [1] https://en.wikipedia.org/wiki/CJK_Unified_Ideographs
  • Bir oyunu asla bitirememenin kesin yolu, işe motor yazmakla başlamaktır.
    Kendi teknolojini yapmak elbette mümkün; ama her aşamada bu teknoloji genel amaçlı bir oyun platformu değil, kendi projenize göre şekillenmiş olmalı.

    • Blog başlatmam lazım!
      Burada “blog başlatmak”tan kasıt, tamamen sıfırdan yeni bir blog motoru yapmak.
    • modd.io’nun hangi kısmından bahsettiğini biraz daha açıklayabilir misin? Bir oyun yapmaya çalışıp başarısız olunmuş bir sonuç mu demek istiyorsun?
    • Motor kullananların çoğu en başta oyun yapmak isteyen kişiler değil; aslında motor yapmak isteyen kişiler olma ihtimali yüksek.
  • Node.js tabanlı çok oyunculu arka uçların, bağlantı sayısı arttığında eninde sonunda sürünürcesine yavaşladığını gördüm. Bu sorunu nasıl çözdüğünüzü merak ediyorum
    Böyle durumlarda Go gibi bir alternatif daha iyi olmaz mı?

    • Neden böyle olduğunu pek anlamadım. Bağlantılar açısından Node’un event loop’u sayesinde HTTP istek/yanıt tarafındaki I/O bloklaması sorun olmaz gibi
      Arka ucun ön uç için fizik hesaplaması gibi ağır işler yaptığını da sanmıyorum
    • uWebSockets(https://github.com/uNetworking/uWebSockets) kullanıyoruz. C ile yazılmış ama NodeJS’te kullanılabilen bir arayüzü var
      Basit testlerde, hızla yavaşlayan diğer popüler WebSocket kütüphanelerinden çok daha iyi performans gösterdi
    • Çoğu IO oyununda darboğazın giriş/çıkış olacağını düşünüyorum. Türün adı üst seviye alan adından geliyor ama bir kelime oyunu gibi de görünüyor
      Bu yüzden Node iyi bir tercih gibi geliyor
    • Ölçeklenebilirlik, özellikle bağlantı sayısı yüksek olduğunda gerçekten dikkate alınması gereken bir konu olabilir. Bizim durumumuzda arka ucu, kayda değer sayıda eşzamanlı bağlantıyı verimli biçimde işleyecek şekilde optimize ettik
      Her oyun en fazla 64 oyuncuyla sınırlı olsa da 100’den fazla bağlantıya kadar test ettiğimizde performans sorunu görmedik. Her oyun yalıtılmış bir konteynerde çalışıyor
  • Yeni bir motor yapma motivasyonunuzu merak ediyorum
    README’ye bakınca silah sistemi (yakın dövüş/mermi), mağaza, istemci tarafı tahminli mermiler ve birim hareketi gibi epey spesifik şeylerin yerleşik olduğu görülüyor
    Bunları neden motorun içine gömdüğünüzü, kopyalanabilir eklentiler olarak yapmadığınızı merak ediyorum. Elbette birçok oyunun bu özelliklere ihtiyacı yok; bu bir oyun motoru mu? Yoksa FPS/RPG/başka belirli türler için bir motor mu?
    Teknolojinin kendisinden hoşlanmıyor değilim ama hâlâ “neden?” sorusu kalıyor. Bu ne için? Neden Three.js ve kendi sunucum yerine bunu kullanmalıyım?

    • Soru için teşekkürler. Motoru, diğer modüler alternatiflere göre daha görüşlü bir mimariye sahip olacak şekilde tasarlamaya bilinçli olarak karar verdik. Çünkü 2D çok oyunculu oyunları son derece hızlı geliştirmek istiyoruz
      Örneğin basit bir MMORPG’yi 2 saatte yaptık: https://www.youtube.com/watch?v=GZVsxkALR5U
      Kullanım kolaylığı ile özelleştirme düzeyi arasında ters bir ilişki olduğunu düşünüyoruz. Yapması zor olarak bilinen çok oyunculu oyunlar ile casual oyun geliştiricileri arasındaki boşluğu kapatmak için ilkini seçtik
    • “Bu ne için?”
      Sanırım sizin için değil; bu tür belirli oyunları yapmak isteyenler için. Her motorun genel amaçlı olması gerekmez
  • Buraya çok uyacak birkaç hobi projem vardı. Kod yazabiliyorum ama hobi projesi yaparken o kadar odaklanmak istemediğim anlar oluyor; bu yüzden low-code ve etkileşimli editör hobi geliştiricileri için iyi görünüyor
    Kişisel olarak en çok heyecan duyduğum şey harita ve dünya üretimi. Oyunu JSON olarak dışa aktarıp programatik olarak değiştirdikten sonra tekrar içe aktarmak en iyi yöntem gibi görünüyor; doğru mu merak ediyorum
    Yine de biraz göz korkutucu. Değiştirilmemiş eğitim dünyası 3500 satır JSON, yani anlaşılması gereken çok şey var
    İlk aklıma gelen yöntem, bilinçli olarak düzenlemeler yapıp JSON’un nasıl değiştiğine bakmak. İyi bir JSON diff görüntüleyicisi de bulmam gerekecek. Böylece dokunmak istediğim kısımları bulmama yardımcı olur gibi. Asset’leri ve harita tile’larını etkileşimli editörde toplayacağımı sanıyorum
    Bu yaklaşımın makul olup olmadığını ve yardımcı olabilecek araçlar olup olmadığını merak ediyorum

    • JSON’u doğrudan düzenlemenizi önermem. Okuması epey zor ve şişkin. modd.io’da haritaları doğrudan değiştirebilen action’lar var
      Topluluğumuzdaki bir üretici ChatGPT ile dinamik olarak harita oluşturuyor. Saklambaç oyunu yapıyor; 2D harita JSON’u üretmesi için prompt gönderiyor ve her yeni tur başladığında o haritayı yüklüyor. Henüz yayımlamadığı için oyunu paylaşmam zor
      Ayrıca topluluk üyelerimizden biri oyun JSON’umuz için bir yorumlayıcı geliştiriyor. Örn: https://pypi.org/project/pymodd/
  • Böyle açık kaynak projelerin daha fazla ortaya çıktığını görmek sevindirici. GitHub yıldızının 100’den az olması şaşırtıcı

    • Yanlış anlamayın, gerçekten merak ettiğim için soruyorum. GitHub yıldızının 100’den az olması neden şaşırtıcı?
    • Muhtemelen daha yeni duyurulduğu içindir