Tramway SDK – die unheilige Verbindung der Engines von Half-Life und Morrowind
(racenis.github.io)- Tramway SDK ist ein in den letzten drei Jahren entwickeltes Grafikpaket/Framework/Game-Engine, das als leichtgewichtige Engine den hohen Hardwareanforderungen und monolithischen Editor-Workflows gängiger Engines entgegentreten will
- Es geht davon aus, dass Mainstream-Engines wie Unity und Godot selbst für einfache Low-Poly-Spiele überzogene Hardware verlangen, und zielt auch auf Hardware der letzten 15 Jahre sowie Software-Rasterisierung als Laufzeitumgebungen ab
- Statt zwischen Node-GUI und Code zu wechseln, schreibt man Code durch Vererbung der Entity-Klasse und nutzt nur die Editoren, die tatsächlich benötigt werden
- Für den Levelbau nutzt es einen Quake-artigen Brush-Workflow mit
.map-Konverter, Lightmaps, Gouraud-Shading und einem Ein-/Ausgabesystem im Stil von Source - Ziel sind Open-World-Streaming und ein RPG-Framework, das einem 3D-RPG-Maker nahekommt; da es sich aber noch in einem frühen Entwicklungsstadium befindet, muss man mit instabilen APIs und fehlenden Implementierungen rechnen
Das Problem, auf das Tramway SDK abzielt
- Tramway SDK ist Grafikpaket, Framework und Game-Engine; daneben wird auch die Heavy-Metal-artige Schreibweise „T̈ra̦m̊ẅa̦ÿ SD̈K“ verwendet
- Die Kritik an Mainstream-Engines konzentriert sich auf Turbobloat
- Unity verlange nach Ansicht des Projekts sehr starke Hardware und viel Strom
- Godot sei etwas besser als Unity, brauche aber weiterhin vergleichsweise leistungsfähige Hardware
- Spiele wie Low-Poly-Horror-Roguelite-Deckbuilder-Simulatoren sollten aus dieser Sicht auch auf 15 Jahre alter Hardware problemlos laufen können
- Tramway SDK stellt heraus, dass es ohne Turbobloat auf nahezu jeder Hardware der letzten 15 Jahre lauffähig sei
- Es kann auf Software-Rasterisierung umschalten, um auch ohne Grafikkarte zu funktionieren
- Als Beispiele werden sogar Geräte wie Toaster oder Kühlschränke genannt, auf denen Grafik angezeigt werden könnte
- Dem Gegenargument „Dann kauf dir eben einen besseren Computer“ hält es drei Gründe entgegen
- das Problem der Erschwinglichkeit, weil viele Menschen sich keine starke Hardware leisten können
- das Problem des Elektroschrotts, weil die Produktion von Computerchips schlecht für die Umwelt ist und man neue Hardware nur kaufen müsste, wenn alte kaputt und nicht reparierbar ist, sofern Software nicht aufgebläht wäre
- die Haltung, dass es keinen Grund gibt, einen neuen Computer zu kaufen, wenn der vorhandene gut funktioniert, nur wegen des Turbobloats anderer
Arbeitsweise und Funktionen
- Node-basierte Produktionsweisen werden kritisiert, weil man dabei mit „mehreren Dingen, die wie ein einziges wirken“ umgehen und zwischen Node-GUI und Code wechseln müsse
- In Tramway SDK reicht es, Code durch Vererbung der Entity-Klasse zu schreiben und anschließend mit dem Level-Editor Levels zu erstellen
- Die Struktur ist entity-zentriert und kommt ohne Nodes aus
- Der Wechsel zwischen Code und Node-GUI wird vermieden
- Auch die monolithischen Editoren gängiger Engines werden als Problem gesehen
- Man müsse warten, bis der gesamte Editor inklusive nicht genutzter Funktionen geladen ist
- Die Editoren von Tramway SDK sind alle optional
- Wer es nur als Framework verwenden will, kann lediglich die C++-Runtime nutzen
- Wer nur Levels erstellen möchte, kann ausschließlich den Level-Editor verwenden
- Datendateien liegen als durch Leerzeichen getrennte Werte vor und können auch ohne Editor von Hand geändert werden
- Grafisch lassen sich Beispielbilder bereits nur mit Lightmaps und Gouraud-Shading erzeugen
- Das entsprechende Beispiel kann auch auf der Fixed-Function-Pipeline einer Grafikkarte auf Direct3D-7-Niveau gerendert werden
- Für den Levelbau wird ein Brush-basierter Workflow aus der Quake-Familie unterstützt
- Tramway SDK bietet einen Konverter für
.map-Dateien und wandelt Brushes in Dreiecksmeshes um - Gezeigt wird ein Ablauf, bei dem Levels in Trenchbroom erstellt und im Tramway-SDK-Level-Editor konfiguriert werden
- Innerhalb der Engine werden Levels mit angewendeten Lightmaps gerendert
- Mit einem Ein-/Ausgabesystem ähnlich Source lassen sich Interaktionen zwischen Entities im Level einrichten
- Künftig soll die gesamte Source-Logic-Entity implementiert werden, damit visuelles Scripting im Level-Editor möglich wird
- Tramway SDK bietet einen Konverter für
- Im RPG-Bereich gelten Werkzeuge wie RPG Maker sowie Morrowind-basierte Mods und Total Conversions, bei denen sich vieles durch Datenänderungen bauen lässt, als interessante Beispiele
- Tramway SDK enthält eine Erweiterung als RPG-Framework, die einem RPG Maker für 3D nahekommt
- Die Engine ist von Anfang an für Level-Streaming ausgelegt, was die Entwicklung von Spielen im Stil von Open-World-RPGs schnell und einfach machen soll
- Kurz gesagt ist Tramway SDK eine entity-basierte Game-Engine im Stil von Quake/Source und bietet optionale Erweiterungen wie Open-World-Streaming und ein RPG-Framework
- Der Entwicklungsstand ist noch sehr früh
- Die API ist instabil
- Funktionen können kaputt sein oder nicht funktionieren
- Viele Elemente sind noch nicht implementiert
- Das Projekt gibt an, sich schnell zu verbessern
- GitHub-Repository: racenis/tram-sdk
1 Kommentare
Meinungen auf Hacker News
Manche würden vielleicht sagen: „Kauf dir einfach einen besseren Computer“, aber genau deshalb stimme ich völlig zu, dass es schlecht ist, einen besseren Computer zu kaufen. Viele Menschen, besonders in Entwicklungsländern, können sich keine Hardware leisten, um Turbobloat auszuführen, und die Chipproduktion hat negative Auswirkungen auf die Umwelt.
Wenn moderne Software nicht so aufgebläht wäre, würde man neue Hardware nur dann kaufen, wenn die vorhandene kaputtgeht und nicht mehr reparierbar ist. Es gibt keinen Grund, einen neuen Computer zu kaufen, wenn der vorhandene einwandfrei funktioniert, nur wegen der aufgeblähten Software anderer Leute; für das Geld könnte man auch 1000 Dosen Dr. Pepper kaufen. Wirklich ein gutes Projekt, ich hoffe, sie posten weiter Updates zum Fortschritt.
Bei Unterhaltung ist das natürlich schwer zu beurteilen; ein alter Game Boy kann mehr Spaß machen als ein moderner 1000-Watt-Gaming-PC.
Der Satz „Eins sollte eins sein. Es sollte nicht aus vielen Dingen bestehen, die so tun, als wären sie eins. Wenn man Nodes verwendet, muss man viele Sammlungen so tun lassen, als wären sie eins“ klingt wirklich sehr nach Terry Pratchett und ist großartig.
Das ist genau ein Satz, der Sam Vimes bei einer komplizierten Ermittlung einfallen könnte; gefällt mir sehr, und ich hoffe, es entwickelt sich weiter. Ich habe es selbst noch nicht ausprobiert, aber ich habe eine Idee, wie ich es für mein AI-Projekt nutzen könnte.
Ein Mensch ist eine Sammlung von Körperteilen, Körperteile sind Sammlungen von Chemikalien, Chemikalien sind Sammlungen von Molekülen, Moleküle sind Sammlungen von Atomen, und trotzdem betrachten wir jede Ebene als eins. Zu sagen, man solle das nicht tun, ergibt keinen Sinn. Das Projekt sieht trotzdem cool aus.
Und Vetinaris Entity-Component-System wirkt zwar kompliziert, funktioniert aber richtig und hält diese verdammte Stadt am Laufen.
Vielleicht ist gemeint, dass die User Experience eines Node-Editors dazu verleitet, Dingen wie einem
VectorausFingers Eigenschaften und Beziehungen zu geben, dass einVectoram Ende aber nur eine „Sammlung von Dingen“ ist und keine „Art“ mit eigenem Verhalten, weshalb es schwierig ist, Code daran zu hängen.Ich frage mich, ob „Alles ist eine Entity und schreib einfach Code“ bedeutet, statt eines
Vectors eine Hand-Klasse zu erstellen, die Fingers enthält und eigenen Zustand sowie eigenes Verhalten hat. Oder ob es darum geht, statt Node-Instanzen zu erstellen, die bestimmte statische Werte und Beziehungs-Member vorab bündeln, eher Unterklassen von Entity weiter abzuleiten und zu konkretisieren.Godots Node/GDScript-Aufbau kann man als eine Art Antwort auf diese Behauptung sehen. Mit Dingen wie dem
$-Operator und Autocomplete versucht er, dieses „Hin und Her“ so reibungslos und integriert wie möglich zu machen. Trotzdem muss am Ende ein Spiel ausgeliefert werden, daher denke ich, dass die Denkweise „eins ist eins“ am Schluss gewinnt.Mit der Zeit bekomme ich den Eindruck, dass es eine äußere Kraft gibt, die die Qualität von Game-Engines senkt. Was sich in der Technik allgemein durchsetzt, sind meist Dinge, für die sich leicht ein Curriculum erstellen lässt.
Node-basierte Editoren wie Unity haben genau die richtige Struktur, um sie über mehrere Unterrichtseinheiten hinweg zu erklären. Engines wie raylib dagegen kann man an einem Nachmittag verstehen, sodass sich ein Universitätskurs auf raylib-Niveau kaum sinnvoll aufbauen lässt. So entsteht ein Kreislauf: Aus Bootcamp-artigen Schulen kommen Amateurentwickler, die nur Unity/Unreal kennen; Unternehmen stellen Leute mit Unity/Unreal-Kenntnissen ein; Universitäten lehren das dann wieder. Das ähnelt auch dem Phänomen, warum Java so populär ist.
Außerdem unterscheiden sich die Anforderungen an Unity-Projekte von Unternehmen zu Unternehmen. Unity muss die Engine daher nicht wie ein einzelner unzufriedener Programmierer, sondern als gewinnorientiertes Unternehmen mit Kunden ständig anpassen – und wird am Ende zu Turbobloat. Die Engines von Half-Life und Morrowind entstanden in der besonderen Situation, dass leidenschaftliche Programmierer dafür bezahlt wurden, das zu entwickeln, was sie für cool hielten. Daraus kamen minimale Engines, die zu professionellen Spieleentwicklern passten, und großartige Technik.
Dieses Projekt scheint irgendwo zwischen raylib und Unity zu liegen. Ich frage mich, ob es zu wenig bietet, um Amateurprogrammierer anzusprechen, und gleichzeitig für Programmierer, die eine kleine Engine wollen, vielleicht schon zu viel macht. Ich hoffe, ich liege falsch; Performance und Reifegrad sehen gut aus. Es gibt definitiv Entwickler, die Unity leid sind, und da die Nostalgiewelle inzwischen in die 2000er wandert, gibt es tatsächlich Nachfrage danach, Spiele zu spielen und zu entwickeln, die grafisch nicht komplexer sind als Half-Life 2. Auch Webdesign und Dokumentationston sind gut.
Wenn man beides zusammen entwirft, kann man hinzugefügte Features aktiv nutzen und Funktionen, die die Engine schlecht beherrscht, vermeiden – oder gleich den Art Style an die Engine anpassen. Die pixeligen, kantigen Mobs von Minecraft passen gut zur Engine; sobald man sie aber detaillierter macht, fällt man in ein Uncanny Valley, in dem sie älter und unbeholfener wirken als Minecraft, bis sie mit genügend Polygonen ordentlich gerendert werden können.
Ich glaube nicht, dass Leute Unity verwenden, weil sie von Professoren, die Komplexität mögen, falsch ausgebildet wurden.
Man muss nur ansehen, was Epic Games mit Fortnite gemacht hat. Sie haben ein flüssig laufendes, kompetitiv geprägtes Spiel wegen Turbobloat-Grafik und Skins kaputtgemacht.
Dem Problem der Turbo-Aufblähung stimme ich voll zu. Heutige Maschinen sind viel leistungsfähiger, aber die meisten Programme fühlen sich eher langsamer an als früher.
Das Projekt ist auch sehr cool, und das Websitedesign bekommt eine Eins mit Sternchen.
Aus der Perspektive von jemandem, der zu Zeiten von Windows 98/2000/XP normale Hardware verwendet hat, ist ein günstiger moderner Laptop mit SSD unter Windows 10/11/KDE/Gnome usw. deutlich reaktionsschneller – selbst wenn man als aufgebläht geltende Webapps wie vscode oder Slack ausführt.
Ich frage mich, ob es einfach „sehr aufgebläht“ bedeutet. Nachdem ich auf der Website weitergelesen habe, gibt es dort auch Formulierungen wie „hyperrealistische Physiksimulation“, daher scheint es letztlich wohl „sehr aufgebläht“ zu bedeuten.
Die Sichtweise, dass „die meisten Unity-Spiele trotz schicker Shader, Normal Mapping und anderer Techniken ziemlich schlecht aussehen“, scheint in bestimmten Generationen immer verbreiteter zu werden.
Eine bestimmte Art von Texture-Mapping-Technik ist definitiv verschwunden. Die Hintergründe von Ikaruga sind besser als nötig, besonders der simple Waldeffekt am Anfang. Auch einige Zugsimulatoren aus der PS2-Ära haben das hinbekommen.
Allerdings bricht diese Methode zusammen, wenn eine starke gerichtete Lichtquelle wie die Sonne auf glänzende Objekte trifft und der Spieler sich bewegt. Wenn die Umgebung diesig ist und es keinerlei dynamische Objekte gibt, kann man viele moderne Tricks ziemlich gut umgehen.
Das ursprüngliche Setting von Silent Hill wurde ja geschaffen, um Optimierungstricks zu rechtfertigen. Um die Verwaltung der Objekte auf dem Bildschirm zu erleichtern, gab es einen permanent nebligen „Nebelraum“. Das Remake verschwendet dagegen enorme Rechenleistung darauf, realistischen Nebel zu erzeugen, statt übernatürlich wirkenden Nebel.
Die künstlerischen Fähigkeiten, mit denen etwas gut aussieht, sind keineswegs verschwunden; sie sind nur sehr ungleich verteilt. Ein Team mit guten Modelern, Texture Artists, Animatoren und Visual-Programming-Kompetenz kann ein Spiel gut aussehen lassen, egal ob mit Unreal, Unity oder einer eigenen Engine.
Für die „scharfen“ Schatten, die der GameCube in Super Mario Sunshine nicht rendern konnte, wurden tatsächlich flache Meshes verwendet. In Delfino Plaza ist der Schatten unter der Markise in der Nähe des Shine Gate kein Texture, sondern ein Mesh. Der geflieste Platz, auf dem dieser Mesh-Schatten liegt, sieht dagegen nicht wegen einer riesigen Texture gut aus, sondern weil Dutzende 128x128px-Texturen sauber UV-gemappt wurden.
Ein modernes Spiel würde vermutlich zwei Ziegeltexturen und ein Noise-Pattern zum Mischen verwenden, alle drei in 2048x2048px, und die Schatten würden per Raytracing scharfe Kanten bekommen. Ironischerweise haben wir mehr VRAM und höhere Busgeschwindigkeiten, entscheiden uns aber für größere statt für mehr Texturen. Beim Normal Mapping ist es ähnlich: Statt es zusammen mit stärker unterteilten Modellen zu verwenden, hält man Normal Maps irrtümlich für veraltet und glaubt, jedes Detail tatsächlich zu modellieren sei der technisch fortschrittlichere Weg. Eine weniger kantige Kugel ist in Ordnung, aber jede Ritze und jeden Kratzer auf der Kugel real zu modellieren, ist dumm und Rechenverschwendung.
Selbst bei einem „2D“-Spiel wie Factorio ist der Polishing-Unterschied zwischen Erstveröffentlichung, Version 1.0 und der heutigen Version enorm. Auch in Spielen mit Mods ist dieser Unterschied klar zu sehen: Mod-Assets sind meist „brauchbar“, wirken aber nicht so ausgearbeitet wie die des Hauptspiels.
Ich habe kürzlich Half-Life 2 wieder gespielt und war überrascht, wie gut es auch heute noch aussieht, selbst ohne hochauflösendes Texture-Pack.
Auch die glänzenden Oberflächen sind meist nicht allzu spiegelnd, was ebenfalls hilft. Diese Entscheidungen passen glaubwürdig zu einer verfallenen, besetzten, extrem dystopischen Welt, und die gedämpften Texturfarben halten alles zusammen.
Valve konzentrierte seine Ressourcen darauf, innerhalb technischer Grenzen Details unterzubringen und das Maximum herauszuholen. Auch 20 Jahre später wirkt das noch kohärent und gut designt.
Aus der Perspektive von jemandem, der in einem kleinen Team mit Godot an einem Low-Poly-Spiel arbeitet, ist das hier großartig.
Aussagen wie „Wenn man etwas mit Nodes baut, muss man ständig zwischen Node-GUI und Code hin und her wechseln“ und „Mainstream-Engines haben einen einzigen riesigen Game-Editor, und egal welche Funktion man nutzen will, man wartet zehn Minuten, bis alles geladen ist“ treffen sehr ins Schwarze. Selbst in Godot nutze ich kaum die ausgefallenen Features, aber der Debug-Loop fühlt sich viel langsamer an als beim Programmieren in anderen Umgebungen.
Auch die Idee, dass mehrere Editoren rund um eine gemeinsame Datenfile-Spezifikation zusammenarbeiten, gefällt mir. Eine integrierte IDE macht es mehreren Entwicklern leicht, Merge-Konflikte zu erzeugen; spezialisiertere Editoren könnten daher auch dabei helfen, dass Entwickler je nach Rolle Umfang und Art ihrer Änderungen begrenzen. Ich bin gespannt, wie sich die Engine weiterentwickelt.
So konnte ich sogar mit einem leistungsschwachen Netbook meinen Teil beitragen. Ich hatte noch nie eine Zeile C# geschrieben, aber ich wollte TDD auf der Kommandozeile nicht aufgeben. Ich fand heraus, dass es möglich ist, und habe es am Ende zum Laufen gebracht. Alle hielten mich für verrückt, und die Developer-Relations-Leute des Sponsors waren keinerlei Hilfe.
Der größte Reibungspunkt an diesem Wochenende war trotzdem, dass der beste Rechner eine Ewigkeit damit verbringen musste, die verdammte Unity-IDE zu starten und neu zu starten. Es ist erstaunlich, welche Fesseln die Leute hinnehmen.
Es werden Begriffe wie „Turbobloat“ verwendet und gesagt, die Engine sei „aufgebläht“; bis zu einem gewissen Grad stimmt das. Trotzdem wäre es sinnvoll zu erklären, was das für einen selbst bedeutet, welche Funktionen man als Bloat betrachtet und was im Tramway-Projekt weggelassen wurde.
Für manche könnte zum Beispiel schon ein enthaltenes RPG-Framework als Bloat gelten, und Tramway enthält so etwas.
Ich mag das C++-Prinzip „Man bezahlt nur für das, was man nutzt“.
Es heißt dort „Verwendung des Frameworks für Anfänger, denen C++ Angst macht oder die es einfach nicht können“; bei mir ist es Letzteres, und ich war dankbar für die Getting Started-Seite.
Die Teekanne erschien, und ich verstand Dinge, von denen ich dachte, ich würde sie nicht verstehen. Ich habe jetzt in der Mittagspause nur 30 Minuten und keine Zeit, das Tutorial zu beenden, aber dass ich Lust bekommen habe weiterzumachen, zeigt sehr gut, wie unterhaltsam und zugänglich diese Dokumentation ist.
Hat jemand die Design Patterns-Seite gefunden? Das ist eine Anzeigetafel mit Ziel 100 %, und ich mag sie sehr.