DevDiary #16 Teil 1 – „Von Hosts und Clients“ – Februar 2021

Hallo alle zusammen! In DevDiary #16 Teil 1 möchten wir euch einen Einblick in den Multiplayer-Modus von Die Gilde 3 geben, wie er funktioniert, welchen Herausforderungen wir gegenüberstehen und wie wir sie angehen.

Bevor wir uns näher mit dem Mehrspielermodus befassen, möchten wir kurz auf ein anderes Thema eingehen: Wir sind uns bewusst, dass in letzter Zeit viele Fragen zum Editor aufgekommen sind. Wir möchten euch dazu sagen, dass wir weiterhin planen, den Editor zu veröffentlichen, aber das wird frühestens erst dann passieren, wenn das Spiel fertig ist. Der Editor macht noch viele Änderungen durch, während wir das Spiel weiterentwickeln.

Doch nun zurück zum Thema dieses Entwicklertagebuchs. Zunächst möchten wir euch einen kurzen Überblick über die allgemeine Architektur geben. Die Gilde 3 verwendet die sehr verbreitete Client-Server-Architektur. Einem Spieler (denjenigen, der das Spiel startet) wird eine spezielle Host-Rolle (auch als Server bezeichnet) zugewiesen, was bedeutet, dass seine Instanz des Spiels entscheiden kann, was in der Spielwelt passiert. Die anderen Spieler sind Clients (Klienten oder Kunden) welche Anfragen an den Host senden müssen, um das Spiel zu beeinflussen.
Wenn ein Client beispielsweise einen seiner Charaktere bewegen möchte, um einen anderen anzugreifen, sendet er eine Anfrage an den Host, die im Wesentlichen lautet: „Bitte führe die Maßnahme Angriff mit Alice auf das Ziel Bob aus“. Der Host überprüft dann die Anfrage und stellt fest, ob Alice diese Maßnahme starten kann (Alice sitzt also gerade nicht im Gefängnis und Bob kann angegriffen werden). Wenn die Anfrage valide (gültig) ist, startet der Host den Prozess der Durchführung des Angriffs. Der erste Schritt in diesem Prozess besteht darin, Alice zu bewegen, damit sie sich auf Bob zubewegt. Der Host broadcastet (sendet) dann an alle Clients, was sich geändert hat. In diesem Broadcast wird beispielsweise Folgendes aufgeführt: „Alice hat jetzt die Maßnahme Angriff mit Ziel Bob. Alice rennt jetzt auf Bob zu.“ Die Maßnahme wird nun nach und nach ausgeführt und der Host informiert alle Clients schließlich in einem seiner regelmäßigen Broadcasts: „Alice hat ihr Ziel erreicht und steht jetzt auf Position X. Alice spielt jetzt die Animation Zuschlagen. Die Lebenspunkte von Bob sind jetzt 20.“

Zusammenfassend gesagt, sendet ein Client Anfragen an den Host, in denen die Aktionen beschrieben werden, die er ausführen möchte. Der Host überprüft die Anfragen und informiert alle Clients mittels Broadcasts (Nachrichten an alle) welche Änderungen in der Welt aufgetreten sind.

Stetige Herausforderungen
Es gibt zwei Hauptherausforderungen, um den Mehrspielermodus stabil und zuverlässig am Laufen zu halten. In der Vergangenheit hatten wir viele Probleme im Zusammenhang mit diesen beiden Themen. Und selbst jetzt kämpfen wir immer noch von Zeit zu Zeit mit ihnen, da sie mit der Funktionsweise des zugrunde liegenden Netzwerksystems von Die Gilde 3 zusammenhängen und sehr schwer vollständig zu lösen sind.

Im heutigen DevDiary möchten wir uns auf das erste dieser beiden Themen konzentrieren, welches allerdings ziemlich technisch ist. Damit Host und Client effektiv kommunizieren können, müssen sie ein gemeinsames Wissen darüber haben, welche Charaktere in der Welt existieren. Im obigen Beispiel senden sie Nachrichten über die Charaktere Alice und Bob. Damit dies funktioniert, müssen beide eine Liste aller Charaktere haben, die auf der Welt existieren. Beide müssen wissen, dass es in der aktuellen Welt Alice, Bob, Charly, Dave usw. gibt. Und diese Liste kann sich ändern, weil Charaktere sterben und neue geboren werden können. Irgendwann muss der Host also eine Nachricht an alle Clients senden, die besagt: „Es gibt einen neuen Charakter, Eva. Sie steht auf Position X, hat braune Haare und trägt das Gewand einer Bürgerlichen (sowie all die anderen Dinge, die es über Eva zu wissen gibt).“ Jeder muss sich an Eva erinnern, damit alle Clients wissen, was zu tun ist, und Eva entsprechend angezogen anzeigen, wenn ein Broadcast mit dem Inhalt „Eva trägt jetzt eine Plattenrüstung“ eingeht.

Wenn etwas schief geht, kann es vorkommen, dass ein Client Eva vergessen hat und nicht weiß, was passieren muss, wenn in einem Broadcast Eva erwähnt wird. Manchmal kann das eine Weile unbemerkt bleiben, aber im schlimmsten Fall können diese Situationen das Spiel zum Absturz bringen. Natürlich gibt es dieses Problem nicht nur für Charaktere, sondern auch für Gebäude, Bäume, Gegenstände und alle anderen Zahnräder, die im Uhrwerk von Die Gilde 3 laufen.

Wie ihr euch denken könnt, ist diese Art von Problem schwer zu diagnostizieren und zu beheben. Wenn wir auf einen solchen Absturz stoßen, ist es normalerweise bereits zu spät, um zu verstehen, was schiefgelaufen ist. Stellt euch beispielsweise einen Absturz vor, der auftritt, weil ein Client die Nachricht „Alice rennt jetzt auf Eva zu“ erhalten hat und der Client nicht weiß, wer Eva ist. Um das Problem zu beheben, müssen wir herausfinden, warum sich der Client nicht an Eva erinnert und zu welchem Zeitpunkt er sie vergessen hat. Da das Spiel aber an diesem Punkt bereits abgestürzt ist, ist das meist schwer herauszufinden.

Das zuverlässigste Hilfsmittel, mit dem wir solche Probleme lösen können, sind Log-Dateien. In einer Log-Datei können wir den Verlauf der Änderungen im Spiel nachvollziehen. Immer wenn ein Charakter stirbt oder ein neuer Charakter geboren wird, wird der Log-Datei ein Eintrag hinzugefügt. Wenn wir eine Log-Datei für eine abgestürzte Spielsitzung haben, können wir in den Verlauf schauen und herausfinden, wann Eva vergessen wurde. Auf dieser Grundlage ist es normalerweise möglich herauszufinden, wo etwas schiefgelaufen ist, und den Fehler zu beheben. Wir haben gute Fortschritte bei der Suche und Lösung vieler dieser Probleme erzielt, aber von Zeit zu Zeit finden wir immer noch einige, sodass unsere Arbeit hier noch nicht abgeschlossen ist.

Wir hoffen, dieses DevDiary hat euch eine ungefähre Vorstellung davon gegeben, wie der Multiplayer-Modus funktioniert. Im nächsten DevDiary werden wir noch einmal über den Mehrspielermodus reden und auf ein Problem eingehen, welches schwer zu lösen ist. Bleib dran für Teil 2 im März!