Présentation sur HN : mon moteur de jeu devient open source
(github.com/moddio)Moteur de jeu Moddio 2
- Moddio est un moteur de jeu conçu avec le multijoueur comme priorité.
- Il intègre du code réseau à autorité serveur, l’interpolation par instantanés et des mécanismes de compensation côté client.
- Il prend en charge plus de 50 joueurs simultanés ou plus de 300 objets en mouvement sur une VM à 5 dollars par mois.
Démo
- Inclus d’emblée : moteur physique Box2D, code réseau à autorité serveur, système d’inventaire et d’objets, attributs intégrés (HP, énergie, etc.) et leur taux de régénération, système de dialogue, boutique, contrôle des unités, projectiles avec prédiction côté client et déplacement des unités, IA des unités et pathfinding A*, contrôles mobiles, etc.
Comment lancer le jeu
- Node 18 ou version ultérieure est requis.
- Après avoir configuré le dépôt, allez dans le répertoire
/src, renommezgame-sample.jsonengame.json, revenez au répertoire racine et lancez le serveur. - Vous pouvez ensuite jouer au jeu sur http://localhost:80.
Comment créer un nouveau jeu à partir de zéro
- Les jeux Moddio sont créés et modifiés avec l’éditeur de jeux Moddio disponible sur https://www.modd.io.
- Après avoir créé un jeu, vous pouvez exporter un
game.jsonutilisable dans une installation locale. - Renommez le JSON du jeu exporté en
game.jsonet déplacez-le dans le répertoire./src.
Comment contribuer
- Moddio est entièrement gratuit et open source sous licence MIT.
- Pour savoir comment devenir contributeur, consultez la page expliquant comment contribuer.
Crédits
- Isogenic Game Engine, Phaser, PlanckJS, uWebsocket, Box2D, assets Kenney, Hero Icons, etc. sont utilisés.
Avis de GN⁺
- Le moteur de jeu Moddio est spécialisé dans le développement de jeux multijoueurs et offre des fonctionnalités puissantes permettant de prendre en charge de nombreux joueurs à faible coût.
- Open source, il continue d’évoluer grâce aux contributions de la communauté, ce qui le rend aussi accessible aux ingénieurs logiciels débutants.
- Il intègre de nombreuses fonctionnalités nécessaires au développement de jeux, offrant aux développeurs un environnement où ils peuvent créer rapidement des prototypes et les tester.
1 commentaires
Avis sur Hacker News
Dans l’écran d’inscription de l’app Android, on demande de saisir le nom d’utilisateur et le mot de passe Google dans ce qui ressemble à un formulaire web à l’intérieur de l’app, et l’utilisateur n’a aucun moyen de savoir si l’app espionne son mot de passe.
D’habitude, il me semble que les apps utilisent un flux qui redirige vers un écran de connexion puis revient dans l’app ; je me demande si ce pattern est difficile à implémenter. Je me demande aussi si c’est un problème lié au support cross-platform.
Cela dit, la méthode décrite plus haut ne devrait vraiment pas arriver, et je pensais que Google l’avait déjà interdite.
Faire adopter un moteur de jeu par les utilisateurs n’est jamais facile, et c’est encore plus difficile s’il est closed source.
À voir la galerie de jeux sur le site, ils semblent s’en être plutôt bien sortis jusqu’ici ; je me demande si ce sont quelques amis qui les ont créés, ou s’il existe une communauté assez active.
Il faut imaginer une structure où l’on peut obtenir un résultat significatif en y consacrant seulement quelques jours, voire quelques heures, de manière casual. Il suffit de se souvenir de Flash.
Le fait que la barrière à l’entrée soit basse, aussi bien pour les développeurs de jeux que pour les joueurs, aide clairement. Pas besoin de téléchargement ni d’inscription.
Rien qu’au titre, je n’aurais pas deviné qu’il s’agissait de modd.io. C’est un framework/une plateforme populaire pour créer des jeux IO.
Je suis allé sur un serveur Brains et je voulais voir à quoi ressemblait l’expérience avec une cinquantaine de joueurs. Comme on pouvait s’y attendre avec des WebSockets, les mouvements étaient un peu saccadés, et comme je construis quelque chose de similaire, je me posais aussi des questions sur la compression réseau.
Je ne suis pas sûr que la seule compression LZ-string suffise. Avec 50 joueurs, ça consomme environ 20 Ko par seconde, alors que Warzone n’utilise qu’environ 48 Ko par seconde pour 150 joueurs. Si les données ne sont pas illimitées, les coûts de bande passante cloud peuvent vite grimper.
C’était aussi étonnant de voir que le buffer d’octets compressé ressemblait à
埒愑䣔橤㤰゙㟍稦獦ঙ惝䓇強栛䳌۬䌃̩佼. Je ne sais pas si c’est normal pour le résultat d’une compression LZ-string, mais ça paraît assez inhabituel.Quoi qu’il en soit, pour réduire les coûts potentiels, il y a beaucoup de marge d’amélioration côté networking. L’ensemble du projet est très impressionnant et très bien réalisé.
La clé, ce sont la prédiction côté client et un algorithme de networking avec rollback. L’état de notre jeu fait environ 1 Ko à 30 Hz, donc il tient généralement dans un seul paquet, et les WebSockets ne sont donc pas si mauvais. Bien sûr, un protocole non fiable serait préférable.
J’ai fait quelques tests avec WebSockets il y a quelques mois, et d’après ce que j’ai compris, utiliser TCP pour des communications sensibles à la latence, comme dans les jeux, présente de sérieux inconvénients. L’en-tête TCP est plus de deux fois plus gros que celui d’UDP, il y a des paquets de contrôle supplémentaires, et l’envoi de nouvelles données est retardé pendant que d’anciennes données sont retransmises. WebSockets fonctionne aussi au-dessus de TCP, donc il a les mêmes inconvénients.
Malgré cela, on dit que TCP garantit la livraison des messages WebSocket, mais j’ai réussi à reproduire des pertes de paquets. Au final, les inconvénients restent, et si l’on a vraiment besoin d’une livraison garantie, il faut construire quelque chose soi-même par-dessus ; dans ce cas, on aurait aussi bien pu le faire dès le départ au-dessus d’UDP uniquement pour les messages qui en ont besoin.
Je n’ai presque pas de connaissances ni d’expérience en networking, à part quelques essais, donc à prendre avec des pincettes.
U+3400àU+4DBFetU+4E00àU+9FFF.La chaîne en question se décode en
\u57d2\u6111\u48d4\u6a64\u3930\u3099\u37cd\u7a26\u7366\u0999\u60dd\u44c7\u5f37\u681b\u4ccc\u06ec\u4303\u0329\u4f7c.[1] https://en.wikipedia.org/wiki/CJK_Unified_Ideographs
Le moyen le plus sûr de ne jamais terminer un jeu, c’est de commencer par écrire un moteur.
Créer sa propre technologie est tout à fait possible, mais à chaque étape, cette technologie doit être adaptée à son propre projet, pas à une plateforme de jeu généraliste.
Par « lancer un blog », j’entends créer un nouveau moteur de blog entièrement from scratch.
J’ai déjà vu des backends multijoueurs basés sur Node.js finir par ralentir au point de se traîner quand le nombre de connexions augmente. Je me demande comment ce problème a été résolu ici
Dans ce cas, une alternative comme Go ne serait-elle pas meilleure ?
Je ne pense pas non plus que le backend fasse de lourds calculs de physique pour le frontend
Dans des tests simples, les performances étaient nettement meilleures que celles d’autres bibliothèques WebSocket populaires qui ralentissent rapidement
Donc Node me semble être un bon choix
Chaque partie est limitée à 64 joueurs au maximum, mais lors de tests avec plus de 100 connexions, nous n’avons pas observé de problème de performances. Chaque partie s’exécute dans un conteneur isolé
Je suis curieux de connaître la motivation derrière la création d’un nouveau moteur
À lire le README, il intègre des choses assez spécifiques comme un système d’armes (corps à corps/projectiles), une boutique, la prédiction côté client pour les projectiles et les déplacements d’unités
Je me demande pourquoi avoir intégré tout cela directement dans le moteur, plutôt que d’en faire des plugins copiables. Bien sûr, beaucoup de jeux n’ont pas besoin de ces fonctionnalités : est-ce vraiment un moteur de jeu ? Ou un moteur pour FPS/RPG/autres genres spécifiques ?
Je n’ai rien contre la technologie elle-même, mais la question du « pourquoi ? » demeure. À quoi ça sert ? Pourquoi devrais-je utiliser ça plutôt que Three.js et mon propre serveur ?
Par exemple, nous avons créé un MMORPG simple en 2 heures : https://www.youtube.com/watch?v=GZVsxkALR5U
Selon nous, il existe un compromis inverse entre la facilité d’utilisation et le niveau de personnalisation. Nous avons choisi la première option pour réduire l’écart entre les jeux multijoueurs, réputés difficiles à créer, et les développeurs de jeux casual
Je ne pense pas que ce soit fait pour vous, mais plutôt pour les gens qui veulent créer ce type précis de jeux. Tous les moteurs n’ont pas besoin d’être généralistes
J’avais quelques projets perso qui auraient sans doute bien collé avec ça. Je sais coder, mais quand je travaille sur un projet hobby, il y a des moments où je n’ai pas envie de m’y plonger autant, donc le low-code et un éditeur interactif me semblent intéressants pour les développeurs amateurs
Ce qui m’enthousiasme le plus, personnellement, c’est la génération de cartes et de mondes. J’ai l’impression que la meilleure méthode serait d’exporter le jeu en JSON, de le modifier par programme, puis de le réimporter ; je me demande si c’est bien le cas
Cela dit, c’est un peu intimidant. Le monde du tutoriel non modifié fait 3 500 lignes de JSON, donc il y a beaucoup de choses à comprendre
La première approche qui me vient à l’esprit serait de faire volontairement des modifications dans l’éditeur et de voir comment le JSON change. Il faudrait aussi que je trouve un bon visualiseur de diff JSON. Ça devrait m’aider à repérer les parties que je veux toucher. Les assets et les tuiles de carte, je les rassemblerais probablement dans l’éditeur interactif
Je me demande si cette approche est raisonnable, et s’il existe des outils utiles pour ça
Un créateur de notre communauté génère dynamiquement des cartes avec ChatGPT. Il travaille sur un jeu de cache-cache : il envoie un prompt demandant de générer du JSON pour une carte 2D, puis charge cette carte à chaque nouveau round. Comme ce n’est pas encore public, il est difficile de partager le jeu
Un autre membre de la communauté développe aussi un interpréteur pour notre JSON de jeu. Exemple : https://pypi.org/project/pymodd/
C’est agréable de voir davantage de projets open source comme celui-ci apparaître. Je suis surpris qu’il ait moins de 100 étoiles GitHub