2 poin oleh GN⁺ 2023-06-26 | 1 komentar | Bagikan ke WhatsApp
  • Hypersomnia adalah shooter multipemain berbasis komunitas yang mendukung duel dengan teman maupun pertempuran antara dua klan, dan merupakan game yang bisa dimainkan online sejak 2017
  • Ditulis dengan Modern C++ dan diimplementasikan tanpa game engine, serta tersedia sebagai game open source gratis
  • Komposisi gamenya menggabungkan taktik Counter-Strike, dinamisme Hotline Miami, dan nuansa nostalgia pixel art RPG jadul; saat ini menyediakan 24 senjata unik, 10 map komunitas, serta dua mode, Bomb defusal dan Gun game
  • Jalur distribusinya meliputi main di browser, Steam, Windows, Linux AppImage, dan macOS dmg; saat game dimulai, interactive Tutorial akan dijalankan
  • Menjalankan server bisa dilakukan melalui Server Docker atau Headless AppImage, dan semua arsip ditandatangani secara digital serta disediakan jalur verifikasi tanda tangan
  • Editor map bawaannya menggunakan pendekatan 100% WYSIWYG yang memungkinkan bekerja langsung di dalam dunia game, dibuat dengan ImGui dan memakai format map JSON
    • Jika folder PNG, WAV, OGG ditempelkan ke direktori map, game akan mengenalinya secara otomatis
    • Jika GIF di-drag-and-drop ke adegan, file itu langsung berfungsi sebagai animasi di dalam game
    • Map yang sedang dikerjakan bisa diuji main hanya dengan satu klik, dan klien yang terhubung akan otomatis mengunduh versi map saat ini beserta resource kustom
    • Server, game, dan editor berada dalam file eksekusi yang sama di semua OS, sehingga sesi bisa dimulai dari editor, dihentikan dengan ESC, lalu kembali ke keadaan semula
  • Jaringannya didasarkan pada determinisme simulasi lintas platform, dan bekerja 100% deterministik di klien browser, klien native Windows, Linux, macOS, hingga build ARM native
    • Alih-alih terus mengirim seluruh status objek lewat jaringan, hanya input pemain yang dikirim, sementara sisanya disimulasikan secara lokal di tiap klien
    • Untuk determinisme perhitungan floating-point, digunakan clang di semua OS, dengan /fp:strict pada build Windows dan -ffp-model=strict pada build ARM, serta fungsi matematika seperti std::sin, std::sqrt diganti dengan implementasi keluarga STREFLOP
    • Dalam contoh dengan dua karakter yang dikendalikan pemain, trafik pada tickrate 60Hz sekitar 40 kbit/s (= 5 KB/s), dan hanya karakter yang dikendalikan pemain yang berkontribusi pada trafik jaringan
  • Klien browser dan klien native dapat bermain bersama di server yang sama berkat libdatachannel dan datachannel-wasm
    • Server bisa di-host dari browser lalu diakses oleh klien native, atau server bisa dibuka dari klien native dan tautan akses browser dapat dikirimkan
    • Versi browser mendukung login Discord, ranked match, dan global Leaderboards; jika akun Discord dan akun Steam ditautkan, versi Steam dan versi web akan berbagi rating yang sama
  • rectpack2D yang ditulis untuk texture packing digunakan di Assassin's Creed: Valhalla, perusahaan pembuat drone, dan dua makalah ilmiah
  • Implementasi memory pool menyediakan penyimpanan berurutan, alokasi O(1), dealokasi O(1), dereferensi O(1), ekspansi otomatis, dan perilaku deterministik; saat mengirim status awal world, status internal pool objek game juga disertakan agar klien dapat mensimulasikan pengenal objek dan urutan memori yang sama secara deterministik
  • Self-updater bawaan otomatis mengunduh dan menerapkan pembaruan, memverifikasi apakah pembaruan berasal dari kunci publik pengembang yang di-hardcode melalui pemanggilan ssh-keygen, dan jika host build diretas lalu versi berbahaya diunggah, klien lama akan menolak menerapkan pembaruan tersebut

1 komentar

 
GN⁺ 2023-06-26
Komentar Hacker News
  • Saya tidak tahu bahwa untuk mendapatkan perilaku yang 100% deterministik pada floating point, Anda memerlukan compiler yang sama meskipun memakai fungsi matematika yang sama
    Saya sempat bertanya-tanya apakah aritmetika floating point tidak sepenuhnya dispesifikasikan, dan ternyata saya seharusnya mencari dulu: https://stackoverflow.com/questions/49471943/floating-point-...
    • Setahu saya, standar memang cenderung tidak sampai menspesifikasikan fungsi matematika
      Ini bukan sesuatu yang selesai hanya dengan satu instruksi sqrt; biasanya dimulai dari aproksimasi Taylor lalu hasilnya disempurnakan dengan beberapa iterasi metode Newton, sehingga muncul pilihan seperti orde deret Taylor, titik pusat, dan jumlah iterasi
      IEEE 754 bisa mengatur perkalian, tetapi untuk sqrt, sin, cos, tan tetap harus ditentukan bagaimana cara menghitungnya, dan implementasi itu biasanya ada di standard library yang disediakan compiler
      Selain itu, floating point tidak memenuhi sifat asosiatif, jadi (a+b)+c != a+(b+c); hanya dengan mengubah urutan operasi dasar saja hasilnya bisa berbeda
    • Saya juga tidak yakin apakah determinisme tetap terjamin jika arsitekturnya berbeda
      Cara pembulatan bisa berbeda antararsitektur, dan jika mencampur arm/amd/intel ada kemungkinan muncul perilaku non-deterministik: https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
      Game ini tampaknya menghindari masalah itu dengan memakai implementasi floating point berbasis software, dan jika ditambah compiler yang diseragamkan, sepertinya bisa lepas dari sebagian besar masalah
    • Ada tulisan yang cukup panjang dari era Sun; sekarang dimiliki Oracle, jadi mungkin lebih mudah membaca kesimpulannya dulu lalu menelusuri balik
      https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
    • Determinisme floating point secara teori terasa seharusnya deterministik, tetapi dalam praktiknya nyaris seperti wilayah tanpa hukum
      Dalam C dan banyak bahasa lain, operator yang umum dipakai tidak dipetakan secara eksplisit ke operasi floating point tertentu, sehingga compiler punya keleluasaan besar
      Selain itu juga ada status global tak terlihat seperti mode pembulatan yang kadang dipakai; kalau saya ingat benar, DirectX dulu suka mengubah flag di belakang layar
    • Bahkan jika memakai compiler yang sama, hasilnya bisa cukup berbeda jika -march berbeda
  • Bagian “networking didasarkan pada determinisme simulasi lintas platform” adalah sesuatu yang sudah dilakukan Springrts[0] pada akhir 2000-an karena alasan yang sama, dan kemungkinan banyak RTS lain juga begitu
    Hanya saja itu bukan open source, dan bukan berarti ini bukan pencapaian. Kenyataannya ini memang sangat sulit
    [0] https://springrts.com/
    • Bagian itu memang muncul dalam detail di bawah judul yang dikutip
      Perbedaannya di sini adalah game RTS tidak memakai fisika floating point deterministik, jadi Hypersomnia memerlukan solusi baru
    • Saya sudah sangat lama bermain Spring dengan Balanced Annihilation
      Itu mengisi kekosongan yang ditinggalkan TA dan SupCom, dan meskipun SupCom 2 sendiri RTS kecil yang cukup bagus dan lebih kasual, rasanya tidak sampai setara
      Dan mari kita tidak membahas PA
      BAR juga tampak cukup menjanjikan: https://www.beyondallreason.info
  • Terlihat menarik, tetapi judulnya benar-benar sulit dibaca
    • Saya juga merasa begitu, dan menurut saya sampai sekarang masih agak berpotensi menyesatkan
      Bukan berarti game itu sendiri masuk ke AC:Valhalla, melainkan library texture packing yang dibuat selama pengembangannya yang dipakai di sana[1]. Tentu ini bukan untuk mengecilkan pencapaiannya; hal itu sendiri sudah layak jadi satu tulisan
      Selain itu, mengatakan bahwa ini adalah sumber dari sistem ECS yang dipakai di Unity juga terasa agak berlebihan. Saya pernah memakai game engine yang menggunakan ECS bahkan sebelum 2010, dan di ranah game engine tampaknya asal-usulnya bisa ditelusuri ke Operation Flashpoint[2]
      [1] https://github.com/TeamHypersomnia/rectpack2D
      [2] https://t-machine.org/index.php/2007/09/03/entity-systems-ar...
  • Saya sangat menyukai tulisan dan proyek seperti ini, dan bersyukur karena tersedia sebagai open source
    Suatu hari kalau punya waktu, mungkin setelah pensiun saya ingin mencoba hal seperti ini, dan proyek-proyek seperti ini sangat mungkin menjadi bahan belajar untuk memahami dunia tersebut
  • Terlihat keren
    Ini mengingatkan saya pada ARC dari akhir 90-an, yaitu Attack Retrieve Capture, yang sekarang nyaris bertahan hidup lewat Armor Critical
    https://en.wikipedia.org/wiki/Attack_Retrieve_Capture
    http://armorcritical.com
  • Pencapaian yang luar biasa, dan gamenya juga tampak hebat
    Saya penasaran pekerjaan komersial lain apa yang telah dilakukan untuk menjaga proyek ini tetap berjalan, apakah ada rencana rilis di Steam, dan bagaimana persistent world memengaruhi gameplay
    Saya juga penasaran bagaimana teknik cerdik untuk merekonstruksi status fisika saat pemain baru masuk terlihat bagi pemain yang sudah ada, misalnya apakah posisi peluru tampak bergeser
    • Belakangan ini saya mengerjakan gameplay programming untuk minigame PUBG ini: https://www.youtube.com/watch?v=tSP5P0QGWa4
      Saya juga berinvestasi dengan baik dari tabungan saya sehingga bisa sepenuhnya fokus pada Hypersomnia
      Saya ingin merilisnya di Steam sebelum 2024

Saat ini sama sekali belum ada dunia persisten; itu hanya sekadar menyebutkan arah yang mungkin diambil ke depannya jika game ini sukses, seperti teaser.
Rekonstruksi fisika sama sekali tidak boleh memindahkan posisi. Yang direkonstruksi hanyalah "keadaan panas" seperti kontak atau pohon, dan momen ketika keadaan ini bermakna hanyalah saat simulasi dijalankan dari satu keadaan ke keadaan berikutnya, jadi setelah itu tidak memengaruhi rendering.
Satu-satunya dampak yang mungkin dirasakan pemain yang sudah ada hanyalah penurunan frame sekali ketika dunia fisika yang perlu direkonstruksi sangat besar, tetapi pada praktiknya semua map masih kecil dan paling cocok untuk pertandingan 3v3

  • Merekonstruksi status fisika saat klien terhubung adalah solusi yang keren untuk masalah sinkronisasi
  • Pertama, ini benar-benar terlihat sangat keren dan melihat hal seperti ini membuatku kembali sadar betapa banyak hal yang tidak kuketahui tentang ilmu komputer
    Kedua, aku menemukan bug besar di MacOS. Pada layar jeda/pengaturan, input mouse meleset jauh sehingga bahkan opsi di menu utama pun tidak bisa diklik
    Aku sudah mengumpulkan rekaman layar, log, dan system report: https://youtu.be/O4OoMdeFAt0
    • Maaf soal masalah MacOS
      Saya hampir selalu bermain di Windows dan Linux, jadi sudah lama tidak menjalankannya di MacOS; saya akan cek apakah ini bisa diperbaiki
  • Waduh, baru sekarang aku sadar kalau selama beberapa tahun ini tanpa sengaja aku terus mengikuti beberapa tulisanmu
    Terutama tulisan tentang ECS dan networking
    Senang melihat perkembangannya sejauh ini
    • Saya memang pernah menulis tentang ECS di Stack Exchange pada 2013, tetapi kurasa ini pertama kalinya saya menerbitkan tulisan yang benar-benar membahas networking
      Saat menjelaskan arsitektur deterministik di README, saya memang menautkan tulisan blog penting dari Glenn Fiedler, tetapi saya bukan orang itu, jadi kalau sempat menimbulkan salah paham, itu bukan maksud saya
  • Gameplay-nya mengingatkanku pada shooter multiplayer top-down lama dari awal 2000-an, Infantry Online
    https://www.freeinfantry.com/
    https://en.m.wikipedia.org/wiki/Infantry_(video_game)