- 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,
clangest utilisé sur tous les OS,/fp:strictest appliqué aux builds Windows,-ffp-model=strictaux builds ARM, et les fonctions mathématiques commestd::sinoustd::sqrtsont 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-keygenqu’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
Avis Hacker News
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-...
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 compilateurEn 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 divergeLe 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
https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
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
-marchchangeCe 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/
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
Ç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
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...
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 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
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
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.
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
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.
C’était surtout ceux sur ECS et le networking.
C’est agréable de voir à quel point ça a progressé.
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.
https://www.freeinfantry.com/
https://en.m.wikipedia.org/wiki/Infantry_(video_game)