Technische Einblicke: Unser Bausystem
Hello, Paxians!
Seit Beginn der Alpha habt ihr viele wunderschöne Bauwerke errichtet, die uns jeden Tag aufs Neue zum Staunen bringen. Das Bausystem ist das bisher meistgenutzte Feature im Spiel. Deshalb dachten wir, dass es euch vielleicht interessieren könnte, ein bisschen mehr über die Technologie zu erfahren, die hinter einem der wahrscheinlich komplexesten Systeme der Videospielgeschichte steht.
Derzeit gibt es in den beliebtesten Heimattal-Zonen rund 400.000 Bauteile. Bei insgesamt 24 Heimattälern pro Welt kommen so in jeder Welt viele Millionen Bauteile zusammen. Die durchschnittliche Baurate liegt bei 10.000 neuen Teilen pro Woche in einem einzelnen Heimattal.
Unser Replikationssystem
Das Replikationssystem sorgt in netzwerkbasierten Multiplayer-Spielen dafür, dass der Spielstatus aller Spieler einheitlich und aktuell ist. Mit anderen Worten: Es empfängt die Input-Informationen eines Spielers und gibt sie an die anderen Spieler weiter.
Die Größe der Baudaten für ein einziges Heimattal beträgt derzeit etwa 30 MB. Ziemlich wenig, oder? Aber stellt euch einmal vor, es spielen 100 Spieler gleichzeitig – das sind schon circa 3 GB an Daten, die vom Server, dem Client (dem PC der Spieler) und unserem Replikationssystem verarbeitet werden müssen.
Die Datenmenge ist so groß, dass sie auf ganz besondere Weise gehandhabt werden muss, und das in allen Phasen des Spielprozesses. Wenn wir die Replikation der Unreal Engine schon für das Gameplay verwenden, können wir sie nicht mehr für die Gebäude nutzen. Daher läuft unsere Gebäudereplikation über einen Repli-Backend-Server, dem wir den kreativen Namen „Repli“ gegeben haben. Er sendet die Baudaten aus der Weltdatenbank an die Clients und Server.
Beim Einloggen stellen sowohl der Client als auch der Server eine Verbindung zum Repli her, der ihnen zunächst den aktuellen Gesamtstatus der Zone sendet. Wie schon erwähnt liegen die Anfangsdaten in den größten Zonen derzeit bei etwa 30 MB. Nach der Replikation des Anfangszustands warten der Client und der Server auf neue Bau-Events vom Repli. Wir verwenden gRPC-Streaming als Kommunikationskanal, um die Bau-Events vom Repli zu übertragen, aber wir wollen uns jetzt nicht in Details über gRPC verlieren. Kurz gesagt: Es stellt sicher, dass alle beteiligten Parteien (der Server, der Repli und die Clients) richtig kommunizieren und sich gegenseitig verstehen.
Ein Bauteil hinzufügen: hinter den Kulissen
Das alles passiert, nachdem ein Spieler den Bauhammer geschwungen hat:
Der Client sendet eine Bau-Anfrage an den Unreal-Server.
Der Server führt ein paar Berechtigungsprüfungen aus, um festzustellen, ob die Bau-Anfrage zulässig ist.
Wenn der Server die Bau-Anfrage genehmigt, sendet er sie an das Backend.
Das Backend führt seine eigenen Prüfungen aus, um die Bau-Anfrage zuzulassen oder abzulehnen.
Sobald die Genehmigung erteilt ist, wird das Bauteil der Hauptdatenbank der Welt hinzugefügt.
Dann wird das Bau-Event von der Datenbank an unseren Repli-Backend-Server gesendet.
Der Repli sendet das Bau-Event sowohl an den Server als auch an den Client.
Der Server und alle Clients in der Zone – in diesem Fall das Heimattal – erzeugen das Bauteil.
Der Server prüft, ob die strukturelle Integrität des Bauwerks gegeben ist.
Der Client berechnet ebenfalls die Integrität, um sie über die Benutzeroberfläche anzuzeigen.
Wie wird das Gebäude für alle Spieler sichtbar?
Die massenhafte Datenreplikation ist nur eine von vielen Herausforderungen. Nachdem der Client alle 400.000 Bauteile des Heimattals (das eben erwähnte 30-MB-Paket) empfangen hat, müssen wir sie sichtbar machen. Der Spieler-PC muss sie also zeichnen und hier kommt die zweite große Herausforderung.
Es ist nicht möglich, ein System zu verwenden, das 400.000 Teile hintereinander zeichnet. Wir brauchten etwas, das auf unsere Bedürfnisse zugeschnitten ist. Die beiden wichtigsten Elemente, die wir dafür verwenden, sind sogenannte instanziierte Static Meshes (ISM) und Bereichsmanager
Mithilfe des ISM können wir mehrere, ja sogar Tausende Teile auf einmal zeichnen lassen, anstatt alle einzeln nacheinander abzuarbeiten.
Die Bereichsmanager (die kastenförmigen Strukturen in dem Video unten), kontrollieren alle Bau- und Zubehörteile in ihren Bereichen. Ihre Aufgabe ist es, Bau- und Zubehörteile zu erstellen und zu zerstören, die Integrität zu berechnen und andere Funktionen zu verwalten, wie z. B. das ISM.
Der Manager sieht sich alle Standardbauteile in seinem Bereich an – nicht die Werkstätten oder die Behälter – und sortiert sie räumlich. Dann fügt er sie in benutzerdefinierte instanziierte Static Meshes ein. Und das macht die Magie möglich.
Aber wir sind noch nicht fertig. Neben den Gebäuden müssen auch die Behälter, Werkstätten und Dekorationen, von denen die meisten ihre eigenen Spielfunktionen besitzen, gezeichnet werden. Alle diese Zubehörteile sind Standardakteure der Unreal Engine, aber im Gegensatz zu den Gebäuden, die man schon von Weitem sehen kann, tauchen sie in Streaming-Distanz direkt um den Charakter herum auf.
In dem Video unten seht ihr, wie die Manager arbeiten und wann die Zubehörteile sichtbar werden oder nicht. Jeder „Kasten“, den du siehst, ist ein Manager. Wie wir oben erklärt haben, kontrolliert jeder Manager das ISM und die Integrität in seinem eigenen Bereich. Zusätzlich dazu kontrollieren sie die Sichtbarkeit der Zubehörteile, d. h. Werkstätten, Behälter und andere Dekorationsteile. Je nachdem, wo sich ein Charakter befindet und wie weit die Streaming-Distanz seines Clients reicht, aktiviert oder deaktiviert der Manager die Sichtbarkeit aller Zubehör-Akteure.
Im Video werden die Manager, welche die Sichtbarkeit der Zubehörteile deaktivieren, rot dargestellt, während die aktiven türkis sind. Lila zeigt an, dass sie noch aktiviert werden müssen und Magenta, dass sie noch deaktiviert werden müssen.
Es gibt noch eine Art von Zubehörteilen, die speziell gehandhabt werden muss: die Lichtquellen. Wenn sich dein Charakter in ihrer Nähe befindet, werden die Lichter mit Unreal Lumen – dem dynamischen globalen Beleuchtungssystem der Unreal Engine 5 – gerendert, um die Immersion zu verbessern. Ab einer bestimmten Distanz werden die Lichter nur noch mithilfe einfacher Lichtkarten dargestellt, um die Leistung zu verbessern. In manchen Tälern gibt es mehr als 20.000 Lichter zu sehen!
Natürlich gelten auch auf Serverseite einige Einschränkungen. Ein einzelner Unreal-Engine-Server kann nur maximal 150–200 Spieler verarbeiten. Wenn sich mehr Spieler im selben Dorf aufhalten wollen, müssen wir Serverinstanzen erstellen. Das ist ein weiterer Bereich, in dem uns unsere eigenen, speziell für unsere Bedürfnisse entwickelten Systeme sehr helfen. Denn dank unseres Replikationssystems sind die Gebäude auf allen Serverinstanzen in Echtzeit sichtbar! Wenn ein Spieler in einer Serverinstanz ein Gebäude baut, sehen alle Spieler in allen anderen Serverinstanzen gleichzeitig, wie sich das Gebäude verändert.
Ein paar letzte Worte
Es ist ganz schön kompliziert, all diese Gebäude und Objekte um den Spieler herum zu erzeugen, ohne dass es zu sichtbaren „Aufhängern“ kommt, und es dauert mehrere Sekunden oder sogar Minuten über viele Frames. Und wie ihr vielleicht schon anhand der Schritt-für-Schritt-Beschreibung oben erraten habt, ist die Integritätsberechnung ein sehr komplexer Prozess. Unsere Server streamen außerdem die Weltinhalte – das bedeutet, dass die Integritätsberechnung so eingerichtet werden muss, dass alle Landschaften schon vorhanden sind, bevor die Berechnung überhaupt beginnt. Wir müssen die physikalischen Zustände für die Bauteile erstellen, ohne dass sich das Spiel aufhängt, und dann iterativ abfragen, wo sich diese Zustände mit den eigentlichen Integritätsberechnungen überschneiden.
Jetzt wisst ihr, warum ihr beim Einloggen oft zuerst die Landschaft, dann die Gebäude und am Schluss die Zubehörteile seht.
Die Baumeister von Pax Dei haben viel schneller gebaut, als wir ursprünglich erwartet hatten. Das ganze System hat schon viele Optimierungen hinter sich und wir haben noch viele Tricks in petto. Das aktuelle System sollte gut funktionieren, bis etwa 500.000 Bauteile erreicht sind. Danach werden neue Probleme auftreten, die wir lösen müssen. Aber es gibt gute Neuigkeiten! Wir planen bereits, das System auf 1.000.000 Bauteile pro Zone zu erweitern. Aber das ist eine Geschichte für ein andermal.
Bis dahin wünschen wir euch viel Spaß beim Weiterbauen.
Unten haben wir ein paar Tipps von Spielern für euch, die die Kunst des Bauens gemeistert haben, damit auch ihr viele prächtige Bauwerke erschaffen könnt!
Pax vobiscum,
Das Mainframe-Team