DevDiary #16 Teil 2 – „Die ganze Welt durch eine Leitung quetschen“ – März 2021

In Teil 1 dieses DevDiary haben wir euch einen kurzen Einblick in die Architektur des Multiplayer-Modus von Die Gilde 3 gegeben. Wir haben zudem darüber gesprochen, wie die Kommunikation zwischen Host und Client fehlschlagen kann, wenn etwas schief geht.
Wenn ihr Teil 1 noch nicht gelesen haben, dann findet ihr ihn hier.

Heute möchten wir mit einem weiteren Thema fortfahren, welches uns immer wieder vor große Herausforderungen stellt: die Datenmenge, die über das Netzwerk gesendet werden muss, um alle Spieler über die Entwicklungen in der Spielwelt auf dem Laufenden zu halten. Immer wenn ein Charakter eine Aktion ausführt, muss der Host die vorgenommenen Änderungen an alle Clients senden. Je mehr Charaktere auf der Welt aktiv herumlaufen und Aktionen ausführen, desto mehr Netzwerkverkehr wird generiert. Wenn zu viel Verkehr generiert wird, hinken die Clients hinterher, was bedeutet, dass es eine zunehmende Verzögerung zwischen der Anfrage einer auszuführenden Aktion und der tatsächlichen Durchführung gibt.

Um dieses Problem zu diagnostizieren, verfügen wir über ein Tool, das den gesamten gesendeten Datenverkehr aufzeichnet und visualisiert. Wie ihr im Bild unten sehen könnt, visualisiert das Tool in einem Diagramm, wie viele Daten im Lauf der Zeit gesendet werden. Die Höhe eines Balkens gibt die Gesamtdatenmenge an. Die farbigen Bereiche in der Leiste zeigen, welche Art von Objekten (Charaktere, Gebäude, Gegenstände usw.) den Daten zugeordnet sind. Die Zahlen neben den Beschriftungen geben an, wie viele dieser Objekte aktualisiert wurden.

In diesem Diagramm stechen die Gebäude durch zu viel Netzwerkverkehr hervor. Gebäude stehen an zweiter Stelle der gesamten Datenverkehrs, obwohl es sich hierbei um nur 29 aktualisierte Instanzen handelt. In diesem Zeitraum wurden aber auch 315 Charaktere aktualisiert, was eine ähnliche Datenmenge erzeugte. Dies bedeutet, dass Gebäude pro Update einen sehr viel höheren Netzwerkverkehr produzieren als Charaktere. Nachdem wir tiefer gegraben hatten, konnten wir feststellen, dass Gebäude mit jedem Update unnötig Daten über lokal gespeicherte Pfade an andere nahe gelegene Gebäude sendeten. Wir konnten dieses Problem im Patch EA 0.9.13 beheben und den von Gebäuden generierten Netzwerkverkehr erheblich reduzieren.

Außerdem haben wir festgestellt, dass auf großen Karten die Anzahl der Versorgungskarawanen sehr hoch werden kann. Die große Anzahl von Charakteren, die sich bewegten, erzeugte auch eine problematische Menge an Netzwerkverkehr. Aus diesem Grund haben wir die Anzahl der Versorgungskarawanen reduziert, die die Märkte in regelmäßigen Abständen auffüllen. Jeder Versorgungskarren befördert nun mehr Waren, sodass weniger Karren erforderlich sind, die die Märkte auffüllen.

Mit diesen Verbesserungen sollte der Mehrspielermodus auf größeren Karten viel reibungsloser laufen. Trotzdem ist die Gesamtmenge des Netzwerkverkehrs immer noch das größte technische Problem für den Mehrspielermodus. Wir werden unser Bestes tun, das immer weiter zu verbessern.

Charakterbewegung
Wir möchten auch noch einen Blick darauf werfen, wie die Bewegung von Charakteren im Mehrspielermodus funktioniert. Es ist ein gutes Beispiel dafür, wie aufwändig bestimmte Features im Mehrspielermodus im Vergleich zum Einzelspielermodus sein können. In Teil 1 dieses DevDiary haben wir den üblichen Ansatz zum Ausführen einer Maßnahme im Mehrspielermodus beschrieben. Der Host muss die Maßnahme ausführen und die daraus resultierenden Änderungen an die Clients senden. Bei naiver Betrachtung berechnet der Host den Pfad für die Bewegung des Charakters und aktualisiert im Laufe der Zeit die Position, während der Charakter den Pfad entlang geht. In diesem Szenario muss jede Änderung der Position des Charakters an jeden Client gesendet werden. Dieser Ansatz hat zwei Probleme. Zum einen muss die Position ständig über das Netzwerk aktualisiert werden. Und zweitens scheint die Bewegung des Charakters bei dem Client zu stottern, da alle Daten, die über das Internet gesendet werden, immer einer inkonsistenten Verzögerung unterliegen.

Es gibt verschiedene Möglichkeiten, dieses Problem zu lösen. In Die Gilde 3 reduzieren wir diese Verzögerung bereits, indem der Host hauptsächlich das Bewegungsziel überträgt. Der Host sendet eine Nachricht mit dem Inhalt: „Alice rennt jetzt in Richtung Position X“ oder „Alice rennt jetzt in Richtung Bob“. Jeder Client führt dann unabhängig von allen anderen alle Schritte aus, die erforderlich sind, um Alice an ihr Ziel zu bringen. Dazu gehört, einen Pfad zu berechnen und Alice auf diesem Pfad zu bewegen, während versucht wird, Kollisionen mit anderen Charakteren auf der Straße zu vermeiden. Sobald Alice ihr Ziel erreicht hat, sendet der Host eine letzte Nachricht: „Alice ist mit der Bewegung fertig. Ihre endgültige Position ist X“. Wenn diese Nachricht vom Client empfangen wird, beenden dieser dementsprechend den Bewegungsprozess und platziert Alice an dieser Position. Bei diesem Ansatz bewegen sich die Charaktere auf dem Client reibungslos, wobei am Ende nur eine geringfügige Korrektur vorgenommen wird, die sicherstellt, dass die Positionen der Charaktere auf allen teilnehmenden Rechnern identisch ist.

Jüngste Probleme, aka „Wo sind meine Freunde hin?“
Viele von euch haben in den letzten Wochen Verbindungsprobleme bemerkt und gemeldet, wenn ihr versucht habt, an Multiplayer-Spielen teilzunehmen. Um diese Probleme richtig zu erklären und wie wir sie angegangen sind, müssen wir einen kleinen Umweg über die Funktionsweise unseres Matchmaking-Systems machen.

Der erste wichtige Teil dieses Systems ist das Matchmaking-Backend, mit dem wir Steam-Spieler mit Spielern von GOG verbinden können. Das Backend wird von einem anderen Team von THQ Nordic entwickelt, gehostet und gewartet. Zweitens verwendet Die Gilde 3 eine Softwarebibliothek, die mit diesem Backend kommuniziert, um eure auf der ganzen Welt gehosteten Mehrspielerpartien zu erzeugen, am Laufen zu halten und dafür zu sorgen, dass eure Partien von anderen Spieler gesehen werden und dass diese sich mit eurem Spiel verbinden können. Wenn ihr ein Spiel hostet, senden wir einen Befehl, um im Backend eine sogenannte Lobby für euch zu erstellen, die wiederum dafür sorgt, dass eure Sitzung (Session) für andere Spieler sichtbar (oder unsichtbar) wird. Außerdem sorgt das Backend dafür, dass nicht mehr Spieler als vorgesehen teilnehmen können. Andere Spieler können eure Sitzung dann in der Liste der verfügbaren Spiele sehen, welche regelmäßig mit neuen Informationen aus dem Backend geupdatet wird. Wenn ihr euch für eine von einem anderen Spieler gehostete Sitzung entscheidet, senden wir einen Befehl an das Backend, dass ihr der speziell für diese Sitzung erzeugten Lobby beitreten möchtet. Wenn dies erfolgreich geschehen ist, benachrichtigt das Backend das Spiel des Hosts, dass jemand beitreten möchte. Die Spielinstanz des Hosts initiiert dann die direkte Kommunikation zwischen eurem Spiel und dem des hostenden Spielers, wodurch ihr der Sitzung schließlich beitretet.

Lasst uns nun einen Blick auf die jüngsten Verbindungsprobleme werfen, die viele von euch hatten. Wir haben Berichte von euch und von unseren internen Testern erhalten, dass die Teilnahme an Multiplayer-Spielen manchmal nicht funktioniert oder sich sehr seltsam verhält. Mithilfe eures Feedbacks, der Arbeit unserer Tester und unserer eigenen Experimente konnten wir das Problem analysieren und feststellen, dass sich das zugrunde liegende Problem im Backend befand und höchstwahrscheinlich mit einem kürzlich durchgeführten Update eingeführt wurde. Wie bei jeder Software treten bei der Implementierung neuer Funktionen häufig Fehler auf, und genau dies war hier der Fall. Wir haben dann dem Backend-Team alle Informationen zur Verfügung gestellt, die wir über das Problem sammeln konnten, und sie haben dann unermüdlich daran gearbeitet, es zu lösen. In der Zwischenzeit haben wir auch einige kleine Verbesserungen vorgenommen, um den Verbindungsprozess reibungsloser zu gestalten. Patch EA 0.9.13.5 enthielt dann einen längeren Verbindungs-Timeout und eine kleine Korrektur zum Trennen von Lobbys. Das erhöhte Timeout war notwendig, da das Backend auch von anderen Spielen von THQ Nordic verwendet wird und von Zeit zu Zeit eine hohe Belastung erfahren kann.

Für die kommende Version von Die Gilde 3 arbeiten wir derzeit an weiteren Verbesserungen, die das Multiplayer-Erlebnis etwas reibungsloser machen sollen. Zum Beispiel aktualisieren wir die Softwarebibliothek, die wir für die Interaktion mit dem Backend verwenden (die neue Version enthält einige Fehlerkorrekturen und Verbesserungen) und wir arbeiten weiter am Verbindungsprozess.

Wir hoffen, dass euch dieses DevDiary einen interessanten Einblick in den Multiplayer-Modus von Die Gilde 3 bieten konnte, und warum es so viel Arbeit macht, alle Probleme in den Griff zu bekommen. Wir werden unser Bestes tun, um den Mehrspielermodus kontinuierlich zu verbessern.