1 points par GN⁺ 2023-12-10 | 1 commentaires | Partager sur WhatsApp
  • 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 game et game.editor ; plutôt que d’utiliser un editor.exe distinct, 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 .csproj via 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/game et src/game.editor
    • game contient les répertoires bin, packed et resources destinés au jeu final
    • game.editor contient les répertoires bin et resources destinés à l’éditeur du jeu
  • Il n’y a pas de editor.exe externe ; 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

 
GN⁺ 2023-12-10
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/

    • Je les découvre, et rien qu’en les parcourant rapidement, je suis convaincu que c’est le meilleur blog de tout Internet
    • Je ne savais pas que c’était la même personne. J’avais vu ce tutoriel il y a quelque temps, et la façon dont le contenu est déroulé est excellente
    • Il me semble que saint11 est la personne qui a fait l’art du jeu Celeste
    • Il a travaillé sur Celeste et Towerfall, deux jeux dont le pixel art est excellent. Il semble vraiment très talentueux
  • 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 CarComponent et de systèmes comme CarMoverSystem ; 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, RemoveFriction et SetVelocity semblent générés à partir de la présence des composants Velocity et Friction, peut-être pour mettre en cache les ID de composants, sans certitude
    Ce 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 performances
    Les 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é

    • Je me pose aussi la question de l’ordre d’exécution des systèmes. Devoir ajouter manuellement les nouveaux systèmes à une liste fixe peut être frustrant, mais en même temps, les systèmes ont souvent des dépendances implicites entre eux, donc il est important de figer l’ordre d’exécution à la compilation
      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#

    • Ça a plutôt bien fonctionné avec une gestion simple des objets et des appels explicites à GC.Collect() à de petits multiples du délai de simulation. Le point optimal semble dépendre du contenu de la scène et du style de gameplay, c’est-à-dire de la manière dont les objets de la scène changent
      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 domaines
    • Oui. Il existe une bonne conférence de Miguel de Icaza sur l’histoire de l’ajout de C# dans les moteurs de jeu, et sur les raisons pour lesquelles il est enthousiaste à l’idée d’utiliser Swift dans Godot, en avançant que le comptage de références de Swift évite les problèmes de pauses du GC
      https://youtu.be/tzt36EGKEZo?si=WNxwcTPGFbJABKez
    • Je dirais que les problèmes de GC concernent presque uniquement Unity. Les autres moteurs de jeu qui utilisent du .NET standard, comme Stride, fonctionnent sans problème
    • Oui. Unity, et même Unreal bien sûr, ont un GC ; il faut donc allouer au démarrage et utiliser du pooling d’objets
    • Comme dans la plupart des autres langages, on peut écrire du C# de manière à éviter les allocations
  • 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

    • Tu peux expliquer les différences un peu plus en détail ?
  • 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

    • Ça me paraît un peu tiré par les cheveux, mais il y a bien eu des gens qui ont pris des articles de The Onion au pied de la lettre
      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
    • Penser comme ça, mais à l’envers, est la seule façon de consommer les informations des médias grand public. De nos jours, tout est biaisé et ridicule à un point difficile à croire
  • C’est quoi ECS ?

    • Probablement Entity Component System. C’est une architecture courante dans les moteurs de jeu
    • C’est une architecture haute performance à la mode en ce moment. Unity essaie beaucoup de la populariser récemment