2 points par GN⁺ 2023-06-26 | 1 commentaires | Partager sur WhatsApp
  • Hypersomnia est un shooter multijoueur porté par la communauté, qui permet des duels entre amis ou des affrontements entre deux clans, et qui est jouable en ligne depuis 2017
  • Il est écrit en C++ moderne, implémenté sans moteur de jeu, et proposé comme jeu gratuit et open source
  • Le jeu combine la tactique de Counter-Strike, le dynamisme de Hotline Miami et la nostalgie pixel art des RPG old school ; il propose actuellement 24 armes à feu uniques, 10 cartes communautaires et deux modes, Bomb defusal et Gun game
  • Les modes de distribution sont le jeu dans le navigateur, Steam, Windows, Linux AppImage et macOS dmg ; au lancement du jeu, un interactive Tutorial est exécuté
  • Un serveur peut être lancé via Server Docker ou Headless AppImage, et toutes les archives sont signées numériquement avec un processus de vérification de signature fourni
  • L’éditeur de cartes intégré fonctionne en 100 % WYSIWYG directement dans le monde du jeu ; il est réalisé avec ImGui et utilise un format de carte JSON
    • Si l’on colle des dossiers PNG, WAV ou OGG dans le répertoire de la carte, le jeu les reconnaît automatiquement
    • Lorsqu’un GIF est glissé-déposé dans une scène, il fonctionne immédiatement comme une animation dans le jeu
    • La carte en cours de travail peut être testée en un clic, et les clients connectés téléchargent automatiquement la version actuelle de la carte ainsi que les ressources personnalisées
    • Le serveur, le jeu et l’éditeur sont inclus dans le même exécutable sur tous les OS, ce qui permet de démarrer une session depuis l’éditeur, de l’interrompre avec ESC, puis de revenir à l’état initial
  • Le networking repose sur un déterminisme de simulation multiplateforme : les clients navigateur, les clients natifs Windows, Linux et macOS, ainsi que les builds ARM natifs, fonctionnent de manière 100 % déterministe
    • Au lieu d’envoyer en continu l’état de tous les objets sur le réseau, seuls les inputs des joueurs sont transmis ; le reste est simulé localement par chaque client
    • Pour garantir le déterminisme des calculs en virgule flottante, clang est utilisé sur tous les OS, /fp:strict est appliqué aux builds Windows, -ffp-model=strict aux builds ARM, et les fonctions mathématiques comme std::sin ou std::sqrt sont remplacées par des implémentations de la famille STREFLOP
    • Dans un exemple avec deux personnages contrôlés par des joueurs, le trafic à un tickrate de 60 Hz est d’environ 40 kbit/s (= 5 KB/s), et seuls les personnages contrôlés par les joueurs contribuent au trafic réseau
  • Les clients navigateur et natifs peuvent jouer ensemble sur le même serveur grâce à libdatachannel et datachannel-wasm
    • Il est possible d’héberger un serveur depuis le navigateur et de s’y connecter avec un client natif, ou d’ouvrir un serveur depuis un client natif et d’envoyer un lien de connexion au navigateur
    • La version navigateur prend en charge la connexion Discord, les matchs classés et les classements mondiaux ; si les comptes Discord et Steam sont liés, les versions Steam et web partagent le même rating
  • rectpack2D, écrit pour le packing de textures, est utilisé dans Assassin's Creed: Valhalla, par un fabricant de drones et dans deux articles scientifiques
  • L’implémentation du pool mémoire fournit un stockage contigu, une allocation en O(1), une libération en O(1), un déréférencement en O(1), une extension automatique et un comportement déterministe ; lors de la transmission de l’état initial du monde, elle inclut même l’état interne du pool d’objets du jeu afin que les clients puissent simuler de façon déterministe les mêmes identifiants d’objets et le même ordre mémoire
  • Le self-updater intégré télécharge et applique automatiquement les mises à jour, vérifie via un appel à ssh-keygen qu’elles proviennent de la clé publique développeur codée en dur, et refuse d’appliquer une mise à jour sur les clients existants si l’hébergement des builds a été piraté et qu’une version malveillante y a été mise en ligne

1 commentaires

 
GN⁺ 2023-06-26
Avis Hacker News
  • Je ne savais pas que pour obtenir un comportement 100 % déterministe avec les nombres à virgule flottante, il fallait aussi utiliser le même compilateur, même avec les mêmes fonctions mathématiques
    Je me demandais si l’arithmétique en virgule flottante n’était pas entièrement spécifiée, mais j’aurais dû commencer par chercher : https://stackoverflow.com/questions/49471943/floating-point-...
    • Si je comprends bien, le standard est plutôt du côté de ne pas spécifier les fonctions mathématiques
      Ce n’est pas juste une instruction sqrt, mais quelque chose qui peut commencer par une approximation de Taylor puis affiner le résultat avec quelques itérations de la méthode de Newton, ce qui laisse des choix sur l’ordre de la série de Taylor, le point central, le nombre d’itérations, etc.
      IEEE 754 peut définir la multiplication, mais pour sqrt, sin, cos, tan, il faut décider de la méthode de calcul, et en général cette implémentation se trouve dans la bibliothèque standard fournie avec le compilateur
      En plus, les nombres à virgule flottante ne vérifient pas l’associativité, donc (a+b)+c != a+(b+c) ; il suffit de changer l’ordre des opérations de base pour que le résultat diverge
    • Je ne suis pas certain que le déterminisme soit garanti entre architectures différentes
      Le mode d’arrondi peut varier selon l’architecture, et mélanger arm/amd/intel peut produire un comportement non déterministe : https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
      Ce jeu semble éviter ce problème en utilisant une implémentation logicielle des flottants, et en y ajoutant un compilateur unifié, cela semble permettre d’échapper à la plupart des problèmes
    • Il existe un texte assez long datant de l’époque Sun ; comme c’est maintenant chez Oracle, il est sans doute plus simple d’en lire d’abord la conclusion puis de remonter
      https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
    • Le déterminisme en virgule flottante semble, en théorie, devoir être déterministe, mais en pratique c’est presque le Far West
      Dans le C et bien d’autres langages, les opérateurs courants ne sont pas explicitement mappés à des opérations flottantes précises, ce qui laisse une grande marge de manœuvre au compilateur
      Il y a aussi un certain usage d’état global invisible, comme le mode d’arrondi ; de mémoire, DirectX modifiait parfois des flags en arrière-plan
    • Même avec le même compilateur, des résultats assez différents peuvent apparaître si -march change
  • La partie « le réseau repose sur le déterminisme d’une simulation multiplateforme » est quelque chose que Springrts[0] faisait déjà pour la même raison à la fin des années 2000, et j’imagine que beaucoup de RTS faisaient pareil
    Ce n’était simplement pas open source, et cela ne veut pas dire que ce n’est pas une prouesse. C’est vraiment très difficile en pratique
    [0] https://springrts.com/
    • Ce point apparaît dans les détails sous le titre cité
      La différence ici, c’est que les jeux RTS n’utilisent pas de physique déterministe en virgule flottante, donc Hypersomnia a besoin d’une nouvelle approche
    • J’ai passé énormément de temps sur Spring avec Balanced Annihilation
      Ça comblait le vide laissé par TA et SupCom ; SupCom 2 était en soi un petit RTS casual plutôt correct, mais ce n’était pas ça
      Et on va éviter de parler de PA
      BAR semble aussi assez prometteur : https://www.beyondallreason.info
  • Ça a l’air intéressant, mais le titre était vraiment difficile à lire
    • Même avis, et je le trouve encore un peu ambigu
      Le jeu lui-même n’a pas été intégré dans AC:Valhalla ; c’est la bibliothèque de texture packing développée au cours du projet qui l’a été[1]. Ce n’est pas pour minimiser l’exploit, et cela pourrait très bien faire à lui seul le sujet d’un article
      Dire aussi que c’était à l’origine du système ECS utilisé dans Unity me semble un peu exagéré. J’ai déjà utilisé des moteurs de jeu avec ECS avant 2010, et côté moteurs de jeu cela semble remonter à Operation Flashpoint[2]
      [1] https://github.com/TeamHypersomnia/rectpack2D
      [2] https://t-machine.org/index.php/2007/09/03/entity-systems-ar...
  • J’aime beaucoup ce genre d’articles et de projets, et je suis reconnaissant qu’ils soient proposés en open source
    Si j’ai un jour le temps, probablement à la retraite, j’aimerais essayer ce genre de choses, et ce type de projet a de bonnes chances de servir de support d’apprentissage pour découvrir cet univers
  • Ça a l’air cool
    Ça me rappelle ARC de la fin des années 90, c’est-à-dire Attack Retrieve Capture, qui ne survit aujourd’hui qu’à travers Armor Critical
    https://en.wikipedia.org/wiki/Attack_Retrieve_Capture
    http://armorcritical.com
  • Réalisation impressionnante, et le jeu a l’air excellent
    Je me demande quels autres travaux commerciaux ont été réalisés pour faire vivre le projet, s’il existe un plan de sortie sur Steam, et quel impact le monde persistant a sur le gameplay
    Je me demande aussi comment la technique astucieuse de reconstruction de l’état physique lorsqu’un nouveau joueur arrive apparaît du point de vue des joueurs déjà présents, par exemple si la position des balles se déplace
    • Récemment, j’ai fait de la programmation gameplay sur ce mini-jeu de PUBG : https://www.youtube.com/watch?v=tSP5P0QGWa4
      J’ai aussi bien investi mes économies, ce qui m’a permis de me consacrer entièrement à Hypersomnia
      J’aimerais le sortir sur Steam avant 2024

Pour l’instant, il n’y a absolument pas de monde persistant ; c’était juste une mention, façon teaser, de la direction que le jeu pourrait prendre s’il rencontre du succès.
La reconstruction de la physique ne doit absolument pas déplacer les positions. Seuls les contacts ou les arbres, c’est-à-dire des « états chauds », sont reconstruits, et ces états n’ont de sens qu’au moment où la simulation passe d’un état au suivant ; ils n’affectent donc pas le rendu par la suite.
Le seul impact possible pour les joueurs déjà présents, c’est une baisse ponctuelle du framerate si le monde physique à reconstruire est énorme, mais en pratique toutes les cartes sont encore petites et conviennent surtout à des matchs en 3v3.

  • Reconstruire l’état physique lors de la connexion d’un client est une solution élégante au problème de synchronisation.
  • D’abord, ça a l’air incroyablement cool, au point d’en être irréaliste, et ce genre de choses me rappelle à quel point je connais mal l’informatique.
    Ensuite, j’ai trouvé un gros bug sur macOS. Dans l’écran de pause / les réglages, l’entrée souris est fortement décalée, au point qu’il est impossible de cliquer même sur les options du menu principal.
    J’ai rassemblé une capture d’écran, des logs et un rapport système : https://youtu.be/O4OoMdeFAt0
    • Désolé pour le problème sur macOS.
      Je joue presque toujours sur Windows et Linux, donc je n’ai pas fait tourner macOS longtemps, mais je vais voir si je peux corriger ça.
  • Mince, je viens de réaliser que je suivais involontairement certains de vos billets depuis des années.
    C’était surtout ceux sur ECS et le networking.
    C’est agréable de voir à quel point ça a progressé.
    • J’ai bien écrit un billet sur ECS sur Stack Exchange en 2013, mais je pense que c’est la première fois que je publie quelque chose de vraiment abouti sur le networking.
      J’ai bien mis dans le README un lien vers l’important billet de blog de Glenn Fiedler quand j’expliquais l’architecture déterministe, mais je ne suis pas cette personne, donc si cela a pu prêter à confusion, ce n’était pas mon intention.
  • Le gameplay fait penser à Infantry Online, un vieux shooter multijoueur en vue du dessus du début des années 2000.
    https://www.freeinfantry.com/
    https://en.m.wikipedia.org/wiki/Infantry_(video_game)