HN-Veröffentlichung: Ich stelle meine Game Engine als Open Source bereit
(github.com/moddio)Moddio Game Engine 2
- Moddio ist eine Game Engine mit Fokus auf Multiplayer.
- Sie enthält integrierten Netzwerkcode mit Serverautorität, Snapshot-Interpolation und clientseitiger Abstimmung.
- Unterstützt mehr als 50 gleichzeitige Spieler oder über 300 bewegliche Objekte auf einer VM für 5 Dollar im Monat.
Demo
- Im Lieferumfang enthalten: Box2D-Physik-Engine, Netzwerkcode mit Serverautorität, Inventar- und Item-System, eingebaute Attribute (HP, Energie usw.) und Regenerationsraten, Dialogsystem, Shop, Unit-Steuerung, clientseitig vorhergesagte Projektile und Unit-Bewegung, Unit-KI und A*-Pfadfindung, mobile Steuerung usw.
So führt man das Spiel aus
- Node 18 oder höher wird benötigt.
- Nach dem Einrichten des Repositorys in das Verzeichnis
/srcwechseln,game-sample.jsoningame.jsonumbenennen, dann ins Root-Verzeichnis zurückkehren und den Server starten. - Das Spiel kann nun unter http://localhost:80 gespielt werden.
So erstellt man ein neues Spiel von Grund auf
- Moddio-Spiele werden mit dem Moddio Game Editor erstellt und bearbeitet, der unter https://www.modd.io verfügbar ist.
- Nach dem Erstellen eines Spiels kann ein
game.jsonexportiert werden, das in einer lokalen Installation verwendet werden kann. - Die exportierte Spiel-JSON in
game.jsonumbenennen und in das Verzeichnis./srcverschieben.
So kann man beitragen
- Moddio ist unter der MIT-Lizenz vollständig kostenlos und Open Source.
- Wer mehr darüber erfahren möchte, wie man Contributor wird, sollte die Seite zum Beitragen besuchen.
Credits
- Verwendet werden unter anderem die Isogenic Game Engine, Phaser, PlanckJS, uWebsocket, Box2D, Kenney-Assets und Hero Icons.
Meinung von GN⁺
- Die Moddio Game Engine ist auf die Entwicklung von Multiplayer-Spielen spezialisiert und bietet leistungsstarke Funktionen, die viele Spieler zu niedrigen Kosten unterstützen.
- Sie ist Open Source und entwickelt sich durch Beiträge der Community kontinuierlich weiter, wodurch sie auch für angehende Software Engineers gut zugänglich ist.
- Da viele für die Spieleentwicklung benötigte Funktionen bereits integriert sind, bietet sie Entwicklerinnen und Entwicklern eine Umgebung, in der sie schnell Prototypen erstellen und testen können.
1 Kommentare
Meinungen auf Hacker News
Auf dem Registrierungsbildschirm der Android-App wird man aufgefordert, Google-Nutzername und Passwort in etwas einzugeben, das wie ein Webformular innerhalb der App aussieht; als Nutzer hat man keine Möglichkeit zu wissen, ob die App das Passwort mitliest.
Normalerweise scheinen Apps einen Flow zu verwenden, bei dem man zu einem Login-Bildschirm weitergeleitet wird und anschließend zurückkehrt; ich frage mich, ob die Umsetzung dieses Patterns schwierig ist. Vielleicht ist das auch ein Problem durch Cross-Platform-Support.
Die oben beschriebene Methode sollte allerdings wirklich nicht vorkommen; ich dachte, Google hätte das bereits verboten.
Nutzer dazu zu bringen, eine Game Engine zu übernehmen, ist nie einfach, und besonders schwer, wenn sie Closed Source ist.
Wenn man sich die Spiele-Galerie auf der Website ansieht, scheint das bisher ziemlich gut gelungen zu sein; ich frage mich, ob ein paar Freunde sie erstellt haben oder ob es eine recht aktive Community gibt.
Man kann sich eine Struktur vorstellen, bei der schon ein paar Tage oder sogar nur ein paar Stunden Casual-Aufwand zu sinnvollen Ergebnissen führen. Man denke an Flash.
Dass die Einstiegshürde sowohl für Spieleentwickler als auch für Spieler niedrig ist, hilft definitiv. Kein Download und keine Registrierung nötig.
Nur anhand des Titels hätte ich nicht gedacht, dass es um modd.io geht. Das ist ein beliebtes Framework/eine beliebte Plattform zum Erstellen von IO-Games.
Ich bin auf einen Brains-Server gegangen und war neugierig, wie die Erfahrung mit etwa 50 Spielern ist. Wie bei WebSockets zu erwarten, wirkten die Bewegungen etwas ruckelig, und weil ich an etwas Ähnlichem arbeite, war ich auch an der Netzwerkkompression interessiert.
Ich bin nicht sicher, ob LZ-String-Kompression allein ausreicht. Bei 50 Spielern werden etwa 20 KB pro Sekunde verwendet, während Warzone bei 150 Spielern nur etwa 48 KB pro Sekunde nutzt. Wenn es keine unbegrenzten Daten sind, können die Cloud-Bandbreitenkosten ziemlich ins Gewicht fallen.
Interessant fand ich auch, dass der komprimierte Byte-Buffer wie
埒愑䣔橤㤰゙㟍稦獦ঙ惝䓇強栛䳌۬䌃̩佼aussieht. Ich weiß nicht, ob LZ-String-Kompression normalerweise solche Ergebnisse liefert, aber es wirkt ziemlich ungewohnt.Jedenfalls gibt es im Networking-Bereich viel Raum für Verbesserungen, um potenzielle Kosten zu senken. Das Gesamtprojekt ist sehr beeindruckend und gut gemacht.
Der Schlüssel sind clientseitige Vorhersage und ein Rollback-Networking-Algorithmus. Unser Game-State ist bei 30 Hz etwa 1 KB groß und passt daher normalerweise in ein einzelnes Paket, sodass WebSockets auch nicht allzu schlecht sind. Natürlich wäre ein unzuverlässiges Protokoll besser.
Vor ein paar Monaten habe ich WebSockets ein wenig getestet, und soweit ich es verstanden habe, hat die Nutzung von TCP für latenzempfindliche Kommunikation wie bei Spielen erhebliche Nachteile. Der TCP-Header ist mehr als doppelt so groß wie bei UDP, es gibt zusätzliche Control-Pakete, und die Übertragung neuer Daten wird verzögert, während alte Daten erneut übertragen werden. WebSockets laufen ebenfalls auf TCP und haben daher dieselben Nachteile.
Trotzdem heißt es oft, TCP garantiere die Zustellung von WebSocket-Nachrichten, aber ich konnte Paketverlust reproduzieren. Am Ende bleiben also die Nachteile bestehen, und wenn man tatsächlich garantierte Zustellung braucht, muss man darüber selbst etwas bauen; dann hätte man die benötigten Nachrichten vermutlich gleich von Anfang an auf UDP aufbauen können.
Ich habe abgesehen von ein wenig Herumprobieren kaum Wissen und Erfahrung mit Networking, also bitte entsprechend einordnen.
U+3400bisU+4DBFundU+4E00bisU+9FFF.Der betreffende String wird als
\u57d2\u6111\u48d4\u6a64\u3930\u3099\u37cd\u7a26\u7366\u0999\u60dd\u44c7\u5f37\u681b\u4ccc\u06ec\u4303\u0329\u4f7cdekodiert.[1] https://en.wikipedia.org/wiki/CJK_Unified_Ideographs
Ein sicherer Weg, ein Spiel niemals fertigzustellen, ist, mit dem Schreiben einer Engine anzufangen.
Eigene Technologie zu bauen ist durchaus möglich, aber in jedem Schritt sollte diese Technologie auf das eigene Projekt zugeschnitten sein und nicht auf eine allgemeine Spieleplattform.
Mit „einen Blog starten“ meine ich hier, von Grund auf eine neue Blog-Engine zu bauen.
Bei Node.js-basierten Multiplayer-Backends habe ich gesehen, dass sie bei steigender Zahl von Verbindungen irgendwann nur noch im Schneckentempo laufen. Mich würde interessieren, wie ihr dieses Problem gelöst habt.
Wäre in so einem Fall eine Alternative wie Go nicht besser?
Ich glaube auch nicht, dass das Backend für das Frontend rechenintensive Physikarbeit erledigt.
In einfachen Tests war die Performance deutlich besser als bei anderen beliebten WebSocket-Bibliotheken, die schnell langsamer wurden.
Deshalb fühlt sich Node wie eine gute Wahl an.
Jedes Spiel ist auf maximal 64 Spieler begrenzt, aber bei Tests mit über 100 Verbindungen haben wir keine Performance-Probleme gesehen. Jedes Spiel läuft in einem isolierten Container.
Mich würde die Motivation interessieren, eine neue Engine zu bauen.
Wenn man ins README schaut, sind ziemlich spezifische Dinge eingebaut, etwa ein Waffensystem (Nahkampf/Projektile), Shops, clientseitig vorhergesagte Projektile und Einheitenbewegung.
Ich frage mich, warum man so etwas fest in die Engine einbaut und nicht als kopierbare Plugins umsetzt. Viele Spiele brauchen solche Features natürlich nicht – ist das also eine Game Engine? Oder eine Engine für FPS/RPG/andere bestimmte Genres?
Ich habe nichts gegen die Technik an sich, aber die Frage „warum?“ bleibt. Wofür ist das gedacht? Warum sollte man das statt Three.js plus eigenem Server verwenden?
Zum Beispiel haben wir in 2 Stunden ein einfaches MMORPG gebaut: https://www.youtube.com/watch?v=GZVsxkALR5U
Aus unserer Sicht gibt es einen Zielkonflikt zwischen Benutzerfreundlichkeit und Anpassbarkeit. Wir haben uns für Ersteres entschieden, um die Lücke zwischen Multiplayer-Spielen, die als schwer zu entwickeln gelten, und Entwicklern von Casual Games zu verkleinern.
Vermutlich nicht für dich, sondern für Leute, die genau solche bestimmten Spiele bauen wollen. Nicht jede Engine muss universell sein.
Ich hatte ein paar Hobbyprojekte, zu denen das hier gut passen würde. Ich kann programmieren, aber bei Hobbyprojekten gibt es Momente, in denen ich mich nicht so stark darauf konzentrieren möchte; deshalb wirken Low-Code und ein interaktiver Editor für Hobbyentwickler attraktiv.
Am meisten freue ich mich persönlich auf Karten- und Welterzeugung. Es sieht so aus, als wäre der beste Weg, ein Spiel als JSON zu exportieren, es per Programm zu verändern und wieder zu importieren – stimmt das?
Allerdings ist das etwas einschüchternd. Die unveränderte Tutorial-Welt hat 3500 Zeilen JSON, da gibt es viel zu verstehen.
Mein erster Ansatz wäre, absichtlich Änderungen im Editor vorzunehmen und zu schauen, wie sich das JSON verändert. Ich müsste auch einen guten JSON-Diff-Viewer finden. Das dürfte helfen, die Stellen zu finden, die ich anfassen möchte. Assets und Kartentiles würde ich wohl im interaktiven Editor zusammenstellen.
Mich würde interessieren, ob dieser Ansatz sinnvoll ist und ob es hilfreiche Tools dafür gibt.
Ein Creator aus unserer Community erzeugt Karten dynamisch mit ChatGPT. Er baut ein Versteckspiel, sendet einen Prompt, der ein 2D-Karten-JSON erzeugen soll, und lädt diese Karte bei jeder neuen Runde. Da es noch nicht veröffentlicht ist, kann ich das Spiel leider nicht teilen.
Außerdem baut ein Community-Mitglied gerade einen Interpreter für unser Game-JSON. Beispiel: https://pypi.org/project/pymodd/
Schön zu sehen, dass mehr solcher Open-Source-Projekte auftauchen. Es überrascht mich, dass es nicht einmal 100 GitHub-Stars hat.