Die in C# entwickelte Pixel-Art-ECS-Game-Engine „Murder“
(github.com/isadorasophia)- Murder Engine ist eine auf FNA aufgebaute ECS-Game-Engine für Pixel Art, befindet sich derzeit in Entwicklung und es ist mit vielen Änderungen sowie möglichen Breaking Changes zu rechnen
- Als Einstiegsbeispiele werden das Game-Jam-Projekt neocityexpress und hellomurder genannt; sie zeigen den Ablauf zum Erstellen von World, Entity und Component
- Die Projektstruktur trennt
gameundgame.editorund setzt statt einer separateneditor.exedarauf, den Editor direkt im eigenen Projekt des Nutzers zu steuern - Die Entwicklungsumgebung unterstützt Linux, MacOS, Windows, Steam Deck; benötigt wird das .NET 8 SDK, und als Spielziele werden Linux, MacOS und Windows unterstützt
- Da es noch kein NuGet-Paket gibt, wird empfohlen, per Git-Submodule zu arbeiten und in der
.csprojdarauf zu verweisen; eine offizielle Unterstützung für Web oder Mobile ist derzeit nicht geplant
Charakter und Status der Murder Engine
- Murder Engine ist eine FNA-basierte ECS-Game-Engine für Pixel Art
- Die Engine befindet sich derzeit in Entwicklung; der Release-Branch soll zwar stabil gehalten werden, dennoch muss mit vielen Änderungen und noch nicht fertiggestellten Teilen gerechnet werden
- Das README warnt mit „Proceed at your own risk“ und weist ausdrücklich auf mögliche Breaking Changes hin
Einstiegsbeispiele und Lernpfad für ECS
- Für Nutzer, die sich schnell über Beispiele einarbeiten möchten, wird empfohlen, mit den folgenden Projekten zu beginnen
- game jam project: Ein Game-Jam-Projekt, an dem sich die Murder-Architektur nachvollziehen lässt
- Hello World project: Ein Beispiel, das zeigt, wie World, Entity und Component erstellt werden
- Wie ECS in Murder angewendet wird, soll laut Hinweis in der Bang-Dokumentation nachgelesen werden
- Bang ist das von Murder verwendete ECS-Framework
Projektstruktur und Editor-Ansatz
- Die Projektstruktur von Murder ist in
resources,src/gameundsrc/game.editorunterteiltgameenthältbin,packedundresourcesfür das fertige Spielgame.editorenthältbinundresourcesfür den Game-Editor
- Es gibt keine externe
editor.exe, sondern nur das eigene Projekt des Nutzers - Diese Struktur wurde gewählt, um wie bei der Entwicklung mit MonoGame- oder FNA-Projekten das gesamte Projekt direkt steuern zu können
- Der Editor ist als separates Projekt angelegt, damit Editor-Code nicht mit dem Game-Code in Berührung kommt und man auf der Editor-Seite frei die gewünschten Arbeiten ausführen kann
Build- und Abhängigkeitsmodell
- Derzeit gibt es kein NuGet-Paket für Murder
- Empfohlen wird, Murder als Git-Submodule einzubinden und in der
.csprojdarauf zu verweisen - Ein Beispiel für die Referenzierung findet sich in HelloMurder.csproj
Anforderungen und unterstützte Plattformen
- Die Entwicklungsumgebung zum Ausführen des Editors unterstützt Linux, MacOS, Windows und Steam Deck
- Erforderlich ist die Installation des .NET 8 SDK
- Als Zielplattformen für Spiele werden Linux, MacOS und Windows unterstützt
- Zu Linux gehört auch Steam Deck
- Konsolen-Support ist derzeit in Arbeit
- Für Web sowie Mobile mit iOS und Android gibt es aktuell keine offiziellen Support-Pläne
Beiträge und Feedback
- Das Projekt befindet sich noch in einer sehr frühen Phase
- Für Vorschläge oder Feedback kann der Entwickler kontaktiert werden; es wird ausdrücklich Interesse an realer Nutzung und Rückmeldungen signalisiert
1 Kommentare
Meinungen auf Hacker News
Als ich sah, dass saint11 daran beteiligt ist, war ich sicher, dass es gut sein würde. Die Pixel-Art-Tutorials sind wirklich gut aufbereitet: http://saint11.org/blog/pixel-art-tutorials/
Neue Game Engines und ECS-Frameworks machen Spaß anzuschauen. Wenn man sich Bang, den ECS-Teil, ansieht, gibt es Beispiele für Komponenten wie
CarComponentund Systeme wieCarMoverSystem; Systeme sind Klassen, und die implementierten Interfaces scheinen zu bestimmen, wann sie ausgeführt werdenEs erinnert ein wenig an DOTS, aber ich habe noch nicht gefunden, wo Systeme dem Spiel hinzugefügt werden und wie Systeme derselben Art sortiert werden. Mich interessiert auch, wie ein System aussieht, das mehrere unterschiedliche Queries macht, etwa nach Autos und Hindernissen
Bang scheint einen Source-Code-Generator zu verwenden. Anders als
GetComponentscheinenTryGetVelocity,RemoveFrictionundSetVelocityauf Basis der Existenz der KomponentenVelocityundFrictiongeneriert zu werden; vielleicht wegen eines Component-ID-Caches, sicher bin ich mir nichtEs ist nicht archetypenbasiert; jede Entity speichert ein Dictionary
component id => component, und jedes System verfolgt, welche Entities zu seinem Filter passen. Ich weiß nicht, wie gut die Performance sein wird, aber bei vielen Spielen kann Entwicklerfreundlichkeit wichtiger sein als PerformanceÄnderungen scheinen auch sofort angewendet zu werden. Dann frage ich mich, ob es von der Entity-ID abhängt, ob etwas im selben Tick verarbeitet wird, wenn ein System einer Entity Komponenten hinzufügt oder entfernt und sich dadurch ändert, ob sie zu einem Filter passt
Beim flüchtigen Blick in die Doku habe ich keine Möglichkeit gesehen, solche Abhängigkeiten oder Reihenfolgen explizit anzugeben, und ich frage mich, wie diese Engine damit umgeht
Die Itch-Seite und der Download eines mit diesem Framework erstellten Jam-Games: https://saint11.itch.io/neo-city-express
Für ein 72-Stunden-Jam-Game beeindruckend. Die Art und der Text sind gut, und auch mechanisch macht es auf unerwartete Weise Spaß
Sehr schön. Der Editor ist extrem stylish, das gefällt mir. MonoGame mochte ich immer, weil es performant und Cross-Platform ist, aber ich habe nie ein großes Spiel damit gebaut, nur ab und zu Demos
Sieht gut aus. Ich frage mich, ob es bei C#-Game-Development Probleme mit GC-Pausen gibt
Bei Szenen und Gameplay im Q3A-Stil ist es sehr robust. Es gibt kaum Szenenelemente, die sich pro Tick ändern, daher sind GC-Pausen meist vernachlässigbar
In .NET 6+ habe ich in einer DIY-Engine bei strategisch schnell wiederholten Aufrufen GC-Pausen von etwa 1–5 ms gemessen. Den niedrigsten Jitter hatte ich, wenn Concurrent/Server/Background-GC in den Projekteinstellungen deaktiviert waren und stattdessen Foreground- plus Workstation-GC verwendet wurde
Es scheint, als blieben nur zwei Optionen: Speicher zu 100 % selbst verwalten oder Müll so häufig wie möglich aufräumen. In modernem .NET ist es fast unmöglich, den GC ohne schwarze Magie wie Low-Level-DLL-Hacks vollständig abzuschalten. Wenn man den Prozess zwischen Arbeitsereignissen oder Spielrunden neu starten kann, ist
Process.Exit()in manchen Bereichen ebenfalls eine gültige GC-Technikhttps://youtu.be/tzt36EGKEZo?si=WNxwcTPGFbJABKez
Nur anhand des Links kann ich es nicht gut einschätzen, aber ich frage mich, wie schwierig es wäre, mit der Murder Game Engine ein F#-Spiel zu erstellen
Ich habe in Unity ein wenig ECS verwendet, und Murder ECS war deutlich einfacher. Die Entwickler haben das wirklich gut gemacht
Ich habe mit Murder ein kleines Arcade-Game-Projekt erstellt; es ist hier spielbar: https://nopetrides.itch.io/bombs-away
Auf der Vorstellungsseite von saint11 steht: „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/
Hat nichts mit der Game Engine zu tun, aber ich finde es amüsant, dass eine böswillige Person sagen könnte: „Die Leute auf dieser Hacker-Website diskutieren über murder.“
In letzter Zeit denke ich viel darüber nach, wie hartnäckige Gegner völlig harmlose Materialien auf diese Weise ausnutzen könnten
Wenn es sich aber so leicht widerlegen lässt, weiß ich nicht, ob es einen großen Unterschied zwischen der Formulierung „Leute diskutieren über murder“ und einer offenen Lüge gibt
Was ist ECS?