2 puan yazan GN⁺ 2023-06-26 | 1 yorum | WhatsApp'ta paylaş
  • Hypersomnia, topluluk temelli çok oyunculu bir shooter; arkadaşlarla düello veya iki klan arasında savaşları destekliyor ve 2017’den beri çevrimiçi oynanabilen bir oyun
  • Modern C++ ile yazılmış ve oyun motoru olmadan geliştirilmiş; ücretsiz, açık kaynaklı bir oyun olarak sunuluyor
  • Oyunun yapısı Counter-Strike’ın taktiklerini, Hotline Miami’nin dinamizmini ve eski usul RPG’lerin piksel sanat nostaljisini birleştiriyor; şu anda 24 benzersiz ateşli silah, 10 topluluk haritası ve Bomb defusal ile Gun game olmak üzere iki mod sunuyor
  • Dağıtım kanalları tarayıcıda oynama, Steam, Windows, Linux AppImage ve macOS dmg; oyun başlarken interactive Tutorial çalışıyor
  • Sunucu çalıştırma Server Docker veya Headless AppImage ile mümkün; tüm arşivler dijital olarak imzalanıyor ve imza doğrulama yolu sağlanıyor
  • Yerleşik harita editörü, oyun dünyasında doğrudan çalışılan %100 WYSIWYG bir yapı sunuyor; ImGui ile yapılmış ve JSON harita formatını kullanıyor
    • Harita dizinine PNG, WAV, OGG klasörleri yapıştırıldığında oyun bunları otomatik olarak tanıyor
    • Bir GIF sahneye sürüklenip bırakıldığında oyun içinde hemen animasyon olarak çalışıyor
    • Üzerinde çalışılan harita tek tıkla playtest edilebiliyor; bağlanan istemciler haritanın mevcut sürümünü ve özel kaynakları otomatik indiriyor
    • Sunucu, oyun ve editör tüm işletim sistemlerinde aynı çalıştırılabilir dosyanın içinde yer aldığından, editörden bir oturum başlatıp ESC ile durdurduktan sonra önceki duruma dönmek mümkün
  • Ağ yapısı çapraz platform simülasyon determinizmine dayanıyor; tarayıcı istemcisi ile Windows, Linux, macOS yerel istemcileri ve yerel ARM derlemeleri dahil %100 deterministik çalışıyor
    • Tüm nesne durumlarını sürekli ağ üzerinden göndermek yerine yalnızca oyuncu girdileri aktarılıyor; geri kalanını her istemci yerelde simüle ediyor
    • Kayan nokta hesaplama determinizmi için tüm işletim sistemlerinde clang kullanılıyor; Windows derlemelerine /fp:strict, ARM derlemelerine -ffp-model=strict uygulanıyor ve std::sin, std::sqrt gibi matematik işlevleri STREFLOP ailesi uygulamalarla değiştiriliyor
    • Oyuncular tarafından kontrol edilen iki karakterin bulunduğu örnekte, 60Hz tickrate için trafik yaklaşık 40 kbit/s (= 5 KB/s); ağ trafiğine yalnızca oyuncu kontrollü karakterler katkı yapıyor
  • Tarayıcı istemcisi ve yerel istemciler, libdatachannel ve datachannel-wasm sayesinde aynı sunucuda birlikte oynayabiliyor
    • Tarayıcıdan sunucu host edip yerel istemciyle bağlanmak mümkün; yerel istemcide sunucu açıp tarayıcı bağlantı linki göndermek de mümkün
    • Tarayıcı sürümü Discord girişi ve dereceli maçları, ayrıca global Leaderboards desteğini sunuyor; Discord hesabı ile Steam hesabı bağlandığında Steam sürümü ve web sürümü aynı rating’i paylaşıyor
  • Doku paketleme için yazılan rectpack2D, Assassin's Creed: Valhalla, bir dron üreticisi şirket ve 2 bilimsel makalede kullanılmış
  • Bellek havuzu uygulaması ardışık depolama, O(1) ayırma, O(1) serbest bırakma, O(1) dereference, otomatik genişleme ve deterministik davranış sağlıyor; başlangıç dünya durumu gönderilirken oyun nesnesi havuzunun iç durumu da dahil edilerek istemcinin aynı nesne tanımlayıcılarını ve bellek sırasını deterministik biçimde simüle edebilmesi sağlanıyor
  • Yerleşik self-updater, güncellemeleri otomatik indirip uyguluyor; ssh-keygen çağrısıyla güncellemenin hardcoded geliştirici açık anahtarından gelip gelmediğini doğruluyor ve derleme barındırma sistemi hacklenip kötü amaçlı bir sürüm yüklense bile mevcut istemci güncellemeyi uygulamayı reddediyor

1 yorum

 
GN⁺ 2023-06-26
Hacker News yorumları
  • Kayan noktalı sayılarda %100 deterministik davranış elde etmek için aynı matematik fonksiyonlarını kullansanız bile aynı derleyicinin gerektiğini bilmiyordum.
    Kayan noktalı aritmetiğin tamamen tanımlanmış olup olmadığını merak etmiştim; önce aramalıymışım: https://stackoverflow.com/questions/49471943/floating-point-...
    • Anladığım kadarıyla standart, matematik fonksiyonlarını tanımlamama tarafına daha yakın.
      İş tek bir sqrt komutuyla bitmiyor; Taylor yaklaşımıyla başlayıp, cevabı iyileştirmek için Newton yöntemini birkaç kez çalıştırmak gibi bir süreç var ve Taylor serisinin derecesi, merkez noktası, yineleme sayısı gibi tercihler ortaya çıkıyor.
      IEEE 754 çarpmayı kurala bağlayabilse de sqrt, sin, cos, tan için hesaplama yönteminin belirlenmesi gerekiyor; genellikle bu uygulama derleyicinin sağladığı standart kütüphanede bulunuyor.
      Üstelik kayan noktalı sayılarda birleşme özelliği geçerli olmadığından (a+b)+c != a+(b+c); yalnızca temel işlemlerin sırasını değiştirmek bile sonuçları farklılaştırabiliyor.
    • Mimari farklı olduğunda da determinizmin garanti edilip edilmediğinden emin değilim.
      Yuvarlama biçimi mimariden mimariye değişebilir; arm/amd/intel karıştırıldığında nondeterministik davranış ortaya çıkma olasılığı var: https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
      Bu oyun o sorundan kaçınmak için yazılım tabanlı kayan nokta uygulaması kullanıyor gibi görünüyor; buna tek tip bir derleyici de eklenince sorunların çoğundan uzak durulabilir gibi.
    • Sun döneminden kalma epey uzun bir belge var; artık Oracle’a ait olduğu için sonuç kısmından başlayıp geriye doğru okumak daha kolay olabilir.
      https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
    • Kayan nokta determinizmi teoride deterministik çalışması gerekiyormuş gibi görünür, ama pratikte kanunsuz bölgeye oldukça yakındır.
      C dahil birçok dilde yaygın operatörler belirli kayan nokta işlemlerine açıkça eşlenmediğinden derleyicinin ciddi takdir payı vardır.
      Ayrıca yuvarlama modu gibi görünmez global durumlar da bir ölçüde kullanılır; hatırladığım kadarıyla DirectX arkada bayrakları değiştirirdi.
    • Aynı derleyiciyi kullansanız bile -march değişirse sonuçlar epey farklılaşabilir.
  • “Ağ katmanı, platformlar arası simülasyon determinizmine dayanıyor” kısmı, Springrts[0]’nin 2000’lerin sonlarında aynı nedenle zaten yaptığı bir şeydi; muhtemelen pek çok RTS de öyleydi.
    Sadece açık kaynak değillerdi; bu, bunun bir başarı olmadığı anlamına gelmiyor. Gerçekten çok zor bir iş.
    [0] https://springrts.com/
    • Alıntılanan başlığın altındaki ayrıntılarda bu kısım yer alıyor.
      Buradaki fark, RTS oyunlarının deterministik kayan noktalı fizik kullanmaması; bu yüzden Hypersomnia için yeni bir çözüm gerekiyor.
    • Spring’i Balanced Annihilation ile çok uzun süre oynadım.
      TA ve SupCom’un bıraktığı boşluğu doldurdu; SupCom 2 kendi başına oldukça iyi, daha casual ve küçük ölçekli bir RTS idi ama onun kadar değildi.
      PA konusunu ise hiç açmayalım.
      BAR da oldukça umut verici görünüyor: https://www.beyondallreason.info
  • İlginç görünüyor, ama başlığı okumak gerçekten zordu.
    • Ben de aynı fikirdeyim; hâlâ biraz yanlış anlaşılmaya açık olduğunu düşünüyorum.
      Oyunun kendisi AC:Valhalla’da yer almış değil; geliştirme sırasında oluşturulan texture packing kütüphanesi kullanılmış[1]. Elbette bu başarıyı küçümsemek istemiyorum; tek başına bir yazıya konu olabilir.
      Ayrıca Unity’de kullanılan ECS sisteminin kaynağı olduğunu söylemek de biraz abartı gibi görünüyor. 2010’dan önce de ECS kullanan oyun motorlarıyla çalışmıştım ve oyun motorları tarafında bunun Operation Flashpoint’ten[2] türemiş gibi göründüğünü düşünüyorum.
      [1] https://github.com/TeamHypersomnia/rectpack2D
      [2] https://t-machine.org/index.php/2007/09/03/entity-systems-ar...
  • Bu tür yazıları ve projeleri gerçekten seviyorum; açık kaynak olarak sunulmasına minnettarım.
    Bir gün zamanım olursa, muhtemelen emeklilikten sonra böyle bir şey denemek istiyorum; bu tür projeler o dünyayı öğrenmek için ders materyali olma potansiyeli taşıyor.
  • Harika görünüyor.
    90’ların sonundaki ARC’yi, yani Attack Retrieve Capture’ı hatırlatıyor; şu anda Armor Critical olarak zar zor ayakta duruyor.
    https://en.wikipedia.org/wiki/Attack_Retrieve_Capture
    http://armorcritical.com
  • Şaşırtıcı bir başarı ve oyun da harika görünüyor.
    Projeyi sürdürebilmek için ticari olarak başka neler yaptığınızı, Steam’e çıkış planı olup olmadığını ve kalıcı dünyanın oynanışı nasıl etkilediğini merak ediyorum.
    Yeni bir oyuncu katıldığında fizik durumunu yeniden kuran akıllı tekniğin mevcut oyunculara nasıl göründüğünü de merak ediyorum. Örneğin mermi konumlarının hareket edip etmediği gibi.
    • Son dönemde PUBG’nin şu mini oyununda oynanış programlaması yaptım: https://www.youtube.com/watch?v=tSP5P0QGWa4
      Birikimlerimi de iyi yatırdığım için tamamen Hypersomnia’ya odaklanabildim.
      Steam’e 2024’ten önce çıkarmak istiyorum

Şu anda kalıcı bir dünya hiç yok; bu yalnızca oyun başarılı olursa gelecekte gidilebilecek yönlere dair teaser niteliğinde bir değinmeydi
Fizik yeniden inşası, konumları hiç hareket ettirmemeli. Yeniden inşa edilen şey yalnızca temaslar veya ağaçlar gibi “sıcak durum”; bu durumun anlamlı olduğu tek an, simülasyonu bir durumdan bir sonraki duruma ilerletirken olduğu için sonraki render işlemini etkilemez
Mevcut oyunculara olabilecek tek etki, yeniden inşa edilecek fizik dünyası çok büyük olduğunda bir karelik düşüş yaşanmasıdır; pratikte ise tüm haritalar hâlâ küçük ve 3v3 maçlara en uygun durumda

  • İstemci bağlandığında fizik durumunu yeniden inşa etmek, senkronizasyon sorununa harika bir çözüm
  • Öncelikle, gerçekten gerçek dışı derecede havalı görünüyor ve böyle şeyleri görünce bilgisayar bilimi hakkında ne kadar az şey bildiğimi yeniden fark ediyorum
    İkinci olarak, MacOS’ta büyük bir bug buldum. Duraklatma ekranında/ayarlarda fare girdisi ciddi şekilde kayıyor; ana menü seçeneklerine bile tıklayamıyorum
    Ekran kaydı, günlükler ve sistem raporunu burada topladım: https://youtu.be/O4OoMdeFAt0
    • MacOS sorunu için üzgünüm
      Neredeyse her zaman Windows ve Linux’ta oynadığım için MacOS’ta uzun süre çalıştırmadım; düzeltebilir miyim bakacağım
  • Vay, birkaç yıldır farkında olmadan yazılarınızdan birkaçını takip ederek okuduğumu şimdi fark ettim
    Özellikle ECS ve ağ tarafıyla ilgili yazılardı
    Bu kadar geliştiğini görmek güzel
    • 2013’te Stack Exchange’de ECS hakkında bir yazı yazmıştım ama ağ tarafı hakkında düzgün bir yazı yayımlayışımın ilk kez bu olduğunu düşünüyorum
      README’de deterministik mimariyi açıklarken Glenn Fiedler’ın önemli bir blog yazısına bağlantı vermiştim, ama ben o kişi değilim; eğer yanlış anlaşılmaya yol açtıysam niyetim bu değildi
  • Oynanış, 2000’lerin başlarından kalma eski top-down çok oyunculu shooter Infantry Online’ı hatırlatıyor
    https://www.freeinfantry.com/
    https://en.m.wikipedia.org/wiki/Infantry_(video_game)