2 Punkte von GN⁺ 2023-06-26 | 1 Kommentare | Auf WhatsApp teilen
  • Hypersomnia ist ein Community-basierter Multiplayer-Shooter, der Duelle mit Freunden oder Kämpfe zwischen zwei Clans unterstützt und seit 2017 online spielbar ist
  • Er wurde in Modern C++ geschrieben und ohne Game Engine umgesetzt und wird als kostenloses Open-Source-Spiel angeboten
  • Das Spielkonzept kombiniert die Taktik von Counter-Strike, die Dynamik von Hotline Miami und die pixelartige Nostalgie von Old-School-RPGs; derzeit gibt es 24 einzigartige Waffen, 10 Community-Maps und zwei Modi: Bomb defusal und Gun game
  • Verfügbar über Browser-Play, Steam, Windows, Linux AppImage und macOS dmg; beim Spielstart wird ein interaktives Tutorial ausgeführt
  • Der Server kann als Server-Docker oder als Headless AppImage ausgeführt werden; alle Archive sind digital signiert, und ein Weg zur Signaturprüfung wird bereitgestellt
  • Der integrierte Map-Editor arbeitet zu 100 % nach dem WYSIWYG-Prinzip direkt in der Spielwelt, wurde mit ImGui erstellt und verwendet ein JSON-Map-Format
    • Wenn PNG-, WAV- und OGG-Ordner in das Map-Verzeichnis kopiert werden, erkennt das Spiel sie automatisch
    • Wird ein GIF per Drag-and-drop in die Szene gezogen, funktioniert es im Spiel sofort als Animation
    • Die in Arbeit befindliche Map kann mit einem Klick playgetestet werden, und verbundene Clients laden automatisch die aktuelle Version der Map und benutzerdefinierte Ressourcen herunter
    • Server, Spiel und Editor befinden sich auf allen Betriebssystemen in derselben ausführbaren Datei, sodass sich eine Sitzung im Editor starten, mit ESC unterbrechen und anschließend in den ursprünglichen Zustand zurückkehren lässt
  • Das Networking basiert auf plattformübergreifendem deterministischem Simulationsverhalten und funktioniert zu 100 % deterministisch zwischen Browser-Client, nativen Clients für Windows, Linux und macOS sowie nativen ARM-Builds
    • Anstatt fortlaufend den Status aller Objekte über das Netzwerk zu senden, werden nur die Spielereingaben übertragen, während jeder Client den Rest lokal simuliert
    • Für deterministisches Gleitkomma-Verhalten wird auf allen Betriebssystemen clang verwendet; auf Windows-Builds kommt /fp:strict, auf ARM-Builds -ffp-model=strict zum Einsatz, und mathematische Funktionen wie std::sin und std::sqrt werden durch Implementierungen aus der STREFLOP-Familie ersetzt
    • Im Beispiel mit zwei von Spielern gesteuerten Charakteren liegt der Traffic bei einer Tickrate von 60 Hz bei etwa 40 kbit/s (= 5 KB/s), und nur von Spielern gesteuerte Charaktere tragen zum Netzwerkverkehr bei
  • Dank libdatachannel und datachannel-wasm können Browser-Client und native Clients zusammen auf demselben Server spielen
    • Es ist möglich, einen Server im Browser zu hosten und sich mit einem nativen Client zu verbinden; ebenso kann ein nativer Client einen Server öffnen und einen Browser-Zugangslink verschicken
    • Die Browser-Version unterstützt Discord-Login, Ranglisten-Matches und globale Leaderboards; wenn Discord- und Steam-Konto verknüpft werden, teilen sich Steam-Version und Web-Version dieselbe Wertung
  • rectpack2D, geschrieben für Texture Packing, wird in Assassin's Creed: Valhalla, von einem Drohnenhersteller und in zwei wissenschaftlichen Arbeiten verwendet
  • Die Implementierung des Memory Pools bietet zusammenhängenden Speicher, O(1)-Allokation, O(1)-Freigabe, O(1)-Dereferenzierung, automatische Erweiterung und deterministisches Verhalten; beim Übertragen des initialen Weltzustands wird auch der interne Zustand des Game-Object-Pools eingeschlossen, damit Clients dieselben Objektkennungen und dieselbe Speicherreihenfolge deterministisch simulieren können
  • Der integrierte Self-Updater lädt Updates automatisch herunter und wendet sie an, prüft über einen ssh-keygen-Aufruf, ob das Update vom hartkodierten öffentlichen Entwicklerschlüssel stammt, und verweigert auf bestehenden Clients die Anwendung von Updates, falls das Build-Hosting kompromittiert wurde und eine bösartige Version hochgeladen wurde

1 Kommentare

 
GN⁺ 2023-06-26
Hacker-News-Kommentare
  • Mir war nicht klar, dass man für 100 % deterministisches Verhalten bei Gleitkommazahlen denselben Compiler braucht, selbst wenn man dieselben mathematischen Funktionen verwendet
    Ich hatte mich gefragt, ob Gleitkomma-Arithmetik nicht vollständig spezifiziert ist, hätte aber wohl zuerst suchen sollen: https://stackoverflow.com/questions/49471943/floating-point-...
    • So wie ich es verstehe, spezifiziert der Standard eher gerade nicht die mathematischen Funktionen
      Es ist nicht einfach ein einzelner sqrt-Befehl, sondern eher etwas, das mit einer Taylor-Näherung beginnt und das Ergebnis dann mit einigen Newton-Iterationen verfeinert; dabei gibt es Entscheidungen wie die Ordnung der Taylor-Reihe, den Mittelpunkt und die Anzahl der Iterationen
      IEEE 754 kann Multiplikation festlegen, aber bei sqrt, sin, cos, tan muss das Berechnungsverfahren definiert werden, und diese Implementierung steckt üblicherweise in der Standardbibliothek, die der Compiler mitbringt
      Außerdem gilt für Gleitkommazahlen das Assoziativgesetz nicht, also (a+b)+c != a+(b+c), sodass schon eine andere Reihenfolge der Grundoperationen zu abweichenden Ergebnissen führen kann
    • Ich bin mir nicht sicher, ob Determinismus auch über unterschiedliche Architekturen hinweg garantiert ist
      Die Rundungsweise kann sich je nach Architektur unterscheiden, und wenn man arm/amd/intel mischt, kann es zu nichtdeterministischem Verhalten kommen: https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
      Dieses Spiel scheint zur Vermeidung des Problems eine Software-Gleitkommaimplementierung zu verwenden, und zusammen mit einem einheitlichen Compiler dürfte das die meisten Probleme aus dem Weg räumen
    • Es gibt einen ziemlich langen Text aus der Sun-Zeit, der jetzt Oracle gehört; vermutlich ist es einfacher, zuerst das Fazit zu lesen und sich dann rückwärts durchzuarbeiten
      https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
    • Gleitkomma-Determinismus wirkt in der Theorie so, als müsste er deterministisch sein, in der Praxis ist es aber fast ein rechtsfreier Raum
      In C und vielen anderen Sprachen sind gängige Operatoren nicht explizit auf bestimmte Gleitkomma-Operationen abgebildet, sodass Compiler viel Spielraum haben
      Dazu kommt unsichtbarer globaler Zustand wie Rundungsmodi, der in gewissem Maß ebenfalls verwendet wird; soweit ich mich erinnere, hat DirectX im Hintergrund gern Flags umgestellt
    • Selbst mit demselben Compiler können sich die Ergebnisse deutlich unterscheiden, wenn -march anders gesetzt ist
  • Der Teil „Networking basiert auf plattformübergreifendem Determinismus der Simulation“ ist etwas, das Springrts[0] aus demselben Grund schon Ende der 2000er gemacht hat, und vermutlich auch viele RTS-Spiele
    Das war nur nicht Open Source, was aber nicht heißen soll, dass es keine Leistung ist. Es ist tatsächlich sehr schwierig
    [0] https://springrts.com/
    • Im Detail unter der zitierten Überschrift wird genau dieser Punkt erwähnt
      Der Unterschied hier ist, dass RTS-Spiele keine deterministische Gleitkomma-Physik verwenden, weshalb Hypersomnia eine neue Lösung braucht
    • Spring lief mit Balanced Annihilation extrem lange
      Es hat die Lücke gefüllt, die TA und SupCom hinterlassen haben, und SupCom 2 war als eher kleines, zugängliches RTS für sich genommen ziemlich gut, aber eben nicht auf diesem Niveau
      Und über PA reden wir besser nicht
      BAR sieht ebenfalls ziemlich vielversprechend aus: https://www.beyondallreason.info
  • Sieht interessant aus, aber der Titel war wirklich schwer zu lesen
    • Ging mir genauso, und ich finde ihn immer noch etwas missverständlich
      Das Spiel selbst wurde nicht in AC:Valhalla verwendet, sondern eine während der Entwicklung entstandene Bibliothek zum Texture Packing[1]. Das soll die Leistung natürlich nicht schmälern; das wäre für sich schon einen eigenen Artikel wert
      Auch die Aussage, es sei die Quelle des in Unity verwendeten ECS-Systems gewesen, wirkt etwas übertrieben. Ich habe schon vor 2010 Game-Engines mit ECS verwendet, und im Bereich Game-Engines scheint es auf Operation Flashpoint[2] zurückzugehen
      [1] https://github.com/TeamHypersomnia/rectpack2D
      [2] https://t-machine.org/index.php/2007/09/03/entity-systems-ar...
  • Ich mag solche Artikel und Projekte wirklich sehr und bin dankbar, dass sie als Open Source verfügbar sind
    Wenn ich irgendwann Zeit habe, wahrscheinlich nach der Rente, würde ich so etwas gern selbst ausprobieren, und solche Projekte könnten dabei als Lehrmaterial dienen, um diese Welt kennenzulernen
  • Sieht cool aus
    Es erinnert mich an ARC aus den späten 90ern, also Attack Retrieve Capture, das heute nur noch mit Mühe als Armor Critical weiterlebt
    https://en.wikipedia.org/wiki/Attack_Retrieve_Capture
    http://armorcritical.com
  • Eine erstaunliche Leistung, und das Spiel sieht ebenfalls großartig aus
    Ich frage mich, was sonst noch kommerziell gemacht wurde, um das Projekt am Laufen zu halten, ob ein Steam-Release geplant ist und wie sich die persistente Welt auf das Gameplay auswirkt
    Mich interessiert auch, wie die clevere Technik zur Rekonstruktion des Physikzustands beim Beitritt neuer Spieler für bestehende Spieler aussieht, zum Beispiel ob sich dadurch Kugelpositionen verschieben
    • Zuletzt habe ich an der Gameplay-Programmierung dieses Minispiels von PUBG gearbeitet: https://www.youtube.com/watch?v=tSP5P0QGWa4
      Ich habe meine Ersparnisse außerdem gut investiert, sodass ich mich ganz auf Hypersomnia konzentrieren konnte
      Ich möchte es vor 2024 auf Steam veröffentlichen

Derzeit gibt es überhaupt keine persistente Welt; es wurde nur so etwas wie ein Teaser erwähnt, in welche Richtung es künftig gehen könnte, falls das Spiel erfolgreich wird
Ein Neuaufbau der Physik sollte Positionen überhaupt nicht verschieben. Neu aufgebaut werden nur Berührungen oder baumartige „Hot States“, und dieser Zustand ist nur in dem Moment relevant, in dem die Simulation von einem Zustand in den nächsten fortgeschrieben wird; auf das spätere Rendering hat das daher keinen Einfluss
Die einzige mögliche Auswirkung auf bestehende Spieler ist, dass bei einer sehr großen Physikwelt während des Neuaufbaus einmal kurz die Framerate einbricht; in der Praxis sind aber alle Maps noch klein und am besten für 3v3-Matches geeignet

  • Der Neuaufbau des Physikzustands beim Verbinden eines Clients ist eine elegante Lösung für Synchronisationsprobleme
  • Erstens sieht das wirklich unrealistisch cool aus, und bei so etwas wird mir wieder klar, wie wenig ich eigentlich über Informatik weiß
    Zweitens habe ich auf MacOS einen größeren Bug gefunden. Im Pausenbildschirm/in den Einstellungen ist die Maus-Eingabe stark versetzt, sodass ich nicht einmal Optionen im Hauptmenü anklicken kann
    Ich habe Bildschirmaufnahme, Logs und einen Systembericht zusammengestellt: https://youtu.be/O4OoMdeFAt0
    • Tut mir leid wegen des MacOS-Problems
      Ich spiele fast immer unter Windows und Linux und habe MacOS daher nicht lange laufen lassen; ich werde nachsehen, ob ich das beheben kann
  • Verdammt, mir ist gerade klar geworden, dass ich seit Jahren unbeabsichtigt einige deiner Texte verfolgt habe
    Vor allem solche über ECS und Networking
    Schön zu sehen, wie weit das gekommen ist
    • Ich habe 2013 einmal etwas über ECS auf Stack Exchange geschrieben, aber ich glaube, das ist das erste Mal, dass ich etwas Ordentliches über Networking veröffentlicht habe
      Als ich in der README die deterministische Architektur erklärt habe, habe ich zwar auf einen wichtigen Blogpost von Glenn Fiedler verlinkt, aber ich bin nicht diese Person; falls das zu einem Missverständnis geführt hat, war das nicht beabsichtigt
  • Das Gameplay erinnert mich an den alten Top-down-Multiplayer-Shooter Infantry Online aus den frühen 2000ern
    https://www.freeinfantry.com/
    https://en.m.wikipedia.org/wiki/Infantry_(video_game)