« Murder », un moteur de jeu ECS en pixel art conçu en C#
(github.com/isadorasophia)- Murder Engine est un moteur de jeu ECS pour le pixel art, construit sur FNA ; il est actuellement en développement, avec de nombreux changements et des breaking changes à prévoir
- Les exemples de démarrage proposés sont le projet de game jam neocityexpress et hellomurder, qui montrent le flux de création de mondes, d’entités et de composants
- La structure du projet sépare
gameetgame.editor; plutôt que d’utiliser uneditor.exedistinct, elle choisit une approche où l’on contrôle directement l’éditeur au sein du projet de l’utilisateur - L’environnement de développement prend en charge Linux, MacOS, Windows et Steam Deck ; seul le SDK .NET 8 est nécessaire, et les cibles de jeu prises en charge sont Linux, MacOS et Windows
- Il n’existe pas encore de package NuGet ; l’approche recommandée consiste à le référencer dans
.csprojvia un git submodule, et aucun support officiel du Web ou du mobile n’est actuellement prévu
Nature et état de Murder Engine
- Murder Engine est un moteur de jeu ECS en pixel art basé sur FNA
- C’est un moteur actuellement en développement ; même si la branche de release vise à rester stable, il faut s’attendre à de nombreux changements et à des parties encore inachevées
- Le README avertit : « Proceed at your own risk », et précise la possibilité de breaking changes
Exemples de démarrage et parcours d’apprentissage ECS
- Pour les utilisateurs qui veulent parcourir rapidement des exemples afin de comprendre le fonctionnement, il est recommandé de commencer par les projets suivants
- game jam project : un projet de game jam permettant d’examiner l’architecture de Murder
- Hello World project : un exemple montrant comment créer des mondes, des entités et des composants
- Pour comprendre comment l’ECS est appliqué dans Murder, la documentation de Bang est recommandée
- Bang est le framework ECS utilisé par Murder
Structure du projet et approche de l’éditeur
- La structure d’un projet Murder est divisée en
resources,src/gameetsrc/game.editorgamecontient les répertoiresbin,packedetresourcesdestinés au jeu finalgame.editorcontient les répertoiresbinetresourcesdestinés à l’éditeur du jeu
- Il n’y a pas de
editor.exeexterne ; seul le projet propre de l’utilisateur existe - Cette structure est un choix destiné à permettre de contrôler directement l’ensemble du projet, comme dans le développement de projets MonoGame ou FNA
- La raison pour laquelle l’éditeur est placé dans un projet séparé est d’éviter que le code de l’éditeur ne touche au code du jeu, tout en permettant côté éditeur de faire librement les opérations souhaitées
Build et gestion des dépendances
- Il n’existe actuellement aucun package NuGet pour Murder
- L’approche recommandée consiste à placer Murder comme git submodule et à le référencer dans
.csproj - Un exemple de référence se trouve dans HelloMurder.csproj
Prérequis et plateformes prises en charge
- Les environnements de développement permettant d’exécuter l’éditeur pris en charge sont Linux, MacOS, Windows et Steam Deck
- Le prérequis nécessaire est l’installation du SDK .NET 8
- Les plateformes cibles prises en charge pour les jeux sont Linux, MacOS et Windows
- Linux inclut Steam Deck
- Le support des consoles est actuellement en cours
- Le Web et le mobile iOS/Android ne font actuellement l’objet d’aucun plan de support officiel
Contributions et retours
- Le projet en est encore à un stade très précoce
- Il est indiqué que l’on peut contacter la créatrice pour proposer des idées ou envoyer des retours, et qu’elle s’intéresse aux usages réels et aux feedbacks
1 commentaires
Avis de Hacker News
J’étais sûr que ce serait bien en voyant le nom saint11 associé au projet. Ses tutoriels de pixel art sont vraiment très bien structurés : http://saint11.org/blog/pixel-art-tutorials/
Les nouveaux moteurs de jeu et frameworks ECS sont toujours intéressants à regarder. Dans Bang, la partie ECS, on trouve des exemples de composants comme
CarComponentet de systèmes commeCarMoverSystem; les systèmes sont des classes, et les interfaces qu’ils implémentent semblent déterminer le moment où ils s’exécutentÇa ressemble un peu à DOTS, mais je n’ai pas encore trouvé où les systèmes sont ajoutés au jeu, ni comment des systèmes d’un même type sont ordonnés. Je me demande aussi à quoi ressemble un système qui effectue plusieurs requêtes différentes, par exemple sur des voitures et des obstacles
Bang semble utiliser un générateur de code source. Contrairement à
GetComponent,TryGetVelocity,RemoveFrictionetSetVelocitysemblent générés à partir de la présence des composantsVelocityetFriction, peut-être pour mettre en cache les ID de composants, sans certitudeCe n’est pas basé sur des archétypes : chaque entité stocke un dictionnaire
component id => component, et chaque système suit quelles entités correspondent à son filtre. Je ne sais pas ce que ça vaut en performances, mais dans beaucoup de jeux, le confort de développement peut compter davantage que les performancesLes modifications semblent aussi s’appliquer immédiatement. Du coup, je me demande si, lorsqu’un système ajoute ou supprime des composants sur une entité et change donc sa correspondance avec un filtre, le fait qu’elle soit traitée dans le même tick dépend de son ID d’entité
En parcourant rapidement la documentation, je n’ai pas vu de moyen d’indiquer explicitement ces dépendances ou cet ordre, et je me demande comment ce moteur gère ça
La page Itch et le téléchargement d’un jeu de jam réalisé avec ce framework : https://saint11.itch.io/neo-city-express
Impressionnant pour un jeu de jam en 72 heures. L’art et l’écriture sont bons, et il y a aussi du fun mécanique d’une façon inattendue
Très sympa. L’éditeur est vraiment stylé, j’aime beaucoup. J’ai toujours bien aimé MonoGame parce qu’il est performant et multiplateforme, mais je n’ai jamais fait de gros jeu avec, seulement quelques démos de temps en temps
Ça a l’air bien. Je me demande s’il y a des problèmes de pauses du GC dans le développement de jeux en C#
Avec des scènes et un gameplay façon Q3A, c’est très robuste. Il y a très peu d’éléments de scène qui changent à chaque tick, donc les pauses du GC sont pour l’essentiel négligeables
Avec .NET 6+, dans un moteur DIY, j’ai mesuré des pauses du GC d’environ 1 à 5 ms lors d’appels stratégiques et fréquents. Dans les paramètres du projet, désactiver le GC concurrent/serveur/en arrière-plan et utiliser un GC foreground + workstation donnait le moins de gigue
Les seules options semblent être soit de gérer 100 % de la mémoire soi-même, soit de nettoyer les déchets le plus souvent possible. Dans les versions récentes de .NET, il est presque impossible de désactiver complètement le GC sans magie noire du genre bidouillage de DLL bas niveau. Si l’on peut redémarrer le processus entre des événements métier ou des manches de jeu,
Process.Exit()est aussi une technique de GC valable dans certains domaineshttps://youtu.be/tzt36EGKEZo?si=WNxwcTPGFbJABKez
Difficile à dire en ne lisant que le lien, mais je me demande à quel point il serait compliqué de faire un jeu en F# avec le moteur Murder
J’ai un peu utilisé ECS dans Unity, et l’ECS de Murder m’a paru beaucoup plus simple. Les développeurs ont vraiment fait du bon travail
J’ai fait un petit projet de jeu d’arcade avec Murder, jouable ici : https://nopetrides.itch.io/bombs-away
Sur la page de présentation de saint11, il est écrit : « Murder Engine: 2D Pixel art C# ECS Game Engine made by Isa! I usually help on the render and physics side of it. »
Isa : https://isadorasophia.com/projects/
Rien à voir avec le moteur de jeu, mais je trouve amusant qu’une personne malveillante puisse dire que « les gens de ce site de hackers discutent de murder »
Ces derniers temps, je réfléchis beaucoup à la façon dont un adversaire déterminé pourrait exploiter ce genre de contenus parfaitement inoffensifs
Cela dit, dans un cas aussi facile à réfuter, je ne sais pas s’il y aurait une grande différence entre dire « des gens discutent de murder » et mentir ouvertement
C’est quoi ECS ?