HN'de paylaşıldı: Oyun motorumu açık kaynak yaptım
(github.com/moddio)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
/srcdizinine gidin,game-sample.jsondosyasınıgame.jsonolarak 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.jsondışa aktarabilirsiniz. - Dışa aktarılan oyun JSON'unu
game.jsonolarak yeniden adlandırın ve./srcdizinine 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
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.
Yine de yukarıda söylenen yöntem gerçekten olmaması gereken bir şey; Google’ın bunu zaten yasakladığını sanıyordum.
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.
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.
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.
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ş.
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.
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.
U+3400~U+4DBF,U+4E00~U+9FFFaralı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\u4f7colarak 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ı.
Burada “blog başlatmak”tan kasıt, tamamen sıfırdan yeni bir blog motoru yapmak.
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ı?
Arka ucun ön uç için fizik hesaplaması gibi ağır işler yaptığını da sanmıyorum
Basit testlerde, hızla yavaşlayan diğer popüler WebSocket kütüphanelerinden çok daha iyi performans gösterdi
Bu yüzden Node iyi bir tercih gibi geliyor
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?
Ö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
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
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ı