MMO-Techniken, Algorithmen und Ressourcen, um die Bandbreite niedrig zu halten?


9

Gibt es Ressourcen und Dokumentationen dazu, wie aktuelle MMOs mit den Aktions- und Bewegungsdaten von der Komprimierung bis zur Verarbeitung auf dem Client umgehen? Irgendwelche Ressourcen für Bewegungsvorhersagealgorithmen?

Ich interessiere mich besonders für diejenigen, die wsad-Bewegung haben und sich darauf konzentrieren, die Latenz niedrig zu halten. Wie hoch ist auch die Paketrate und -größe für verschiedene Arten von MMOs (netzwerkbezogen)?

Gibt es eine Möglichkeit, die Paketrate zu skalieren oder einige Pakete vollständig zu deaktivieren, wenn der Spieler sie nicht erreichen oder im späteren Fall sehen kann?

Antworten:


9

Nun, es gibt dieses Buch - das jetzt ein bisschen alt ist und das ich nie wirklich gelesen habe, aber es stammt von einem seriösen Verlag. Ich habe auch dieses gefunden , das neuer ist, aber ich habe noch nie davon gehört. Beide behaupten, MMO- (oder zumindest Online-) Spieleentwicklungsprobleme abzudecken; Die clientseitige Vorhersage ist jedoch unabhängig von der Größe Ihrer gleichzeitigen Spielerbasis mehr oder weniger gleich, und Google verfügt über zahlreiche Informationen dazu .

Es ist wichtig zu wissen, dass es für einen Indie- / Hobby-Entwickler aus praktischer Sicht ziemlich schwierig ist, ein Spiel zusammenzustellen, das populär genug ist, um sogar genug Spieler zu gewinnen, um eine theoretische maximale Parallelität zu erreichen, die hoch genug ist, um als "massiv" angesehen zu werden. Aber die Techniken können für die Forschung immer noch lehrreich sein.

Es gibt zwei Hauptklassifikationen von Dingen, die Sie tun können:

  • Seien Sie aggressiv, wenn Sie nur die minimale Datenmenge an die minimale Gruppe von Clients senden, die diese benötigen.
  • Entwerfen Sie ein Spiel, das den Spielern keinen Anreiz gibt, sich zu sehr zu sammeln, und das Ihnen dabei hilft, die "Gruppe von Kunden, die Dinge benötigen" im Allgemeinen klein zu halten.

Das zweite Problem ist wirklich ein Problem des Spieldesigns und der sozialen Manipulation - es ist besonders schwierig, da Multiplayer-Spiele von Natur aus sozial sind. Dies ist Teil ihrer Attraktivität, sodass Sie Gruppen von Spielern nicht zu sehr entmutigen möchten. Auf der anderen Seite wird ein Spiel, bei dem jeder auf der Welt den einen Kerl spawnt, der die beste Beute im Spiel fallen lässt, schwer zu skalieren sein.

Bei der ersten Option können Sie abgestufte Nachrichtenübermittlung in Betracht ziehen. Es gibt einige Dinge bei anderen Spielern, die immer wichtig sind, z. B. Positionen. Andere Dinge, wie z. B. die Gesundheit, sind für Objekte, die der aktuelle Spieler noch nicht sehen kann, möglicherweise nicht so wichtig. Sie steuern also, was Sie an diesen Spieler senden, basierend auf der relativen Entfernung aller anderen Einheiten in seiner Nähe - dies ist im Wesentlichen eine Drosselung die Daten, die Sie senden, wie Sie im letzten Teil Ihrer Frage erwähnt haben, sowie sie filtern.

Sehr große Multiplayer-Architekturen puffern auch Berichte, für die keine sofortigen Maßnahmen erforderlich sind. An den Server gesendete Nachrichten zum Speichern von Zeichen können in Deltas mit vollständigen Aktualisierungen nur an kritischen Punkten ausgeführt werden. Diese Aktualisierungen können auf einem Drosselserver gepuffert werden, sodass sie an den Server gesendet werden, der die Zeichendaten tatsächlich in einem stabilen Zustand hält. Regelmäßige Art und Weise - Wenn Ihre Player-Basis skaliert, müssen Sie sich um die Optimierung der Festplatten-E / A sowie des Netzwerkverkehrs kümmern. Sie möchten nicht, dass Ihre Charakterdatenbank verprügelt wird.

Die Paketrate und -größe ist von Spiel zu Spiel sehr unterschiedlich, genau wie bei Nicht-MMO-Spielen. Es ist wirklich eine sehr anforderungsspezifische Sache und es gibt keine allgemeinen Standards.


1
Es gibt auch eine Fortsetzung des ersten Buches (Massively Multiplayer Game Development 2). Es ist meiner Meinung nach keine besonders nützliche Buchreihe (es ist definitiv kein Anfang-zu-Ende-Buch zum Erstellen eines MMOs in x Stunden, wie es die meisten Spieleentwicklerbücher sind), aber es werden einige der theoretischen Probleme erörtert in dieser Frage gestellt. Und vielleicht wäre es für jemanden nützlicher, der bereits ein teilweise entwickeltes MMO hat.
Ricket

5

Informieren Sie sich zusätzlich zu der obigen Antwort über TCP_NODELAY und die Funktionsweise der Fensterskalierung. Das Verständnis der Details von TCP (und ja, Sie möchten TCP und nicht UDP verwenden, es sei denn, die Aussicht, differenzielle Aktualisierungen zu verarbeiten, die nicht in der richtigen Reihenfolge eingehen, macht Ihnen Spaß) und die erneute Übertragung sind für die Latenzkontrolle von entscheidender Bedeutung.


4
Ich werde wiederholen, dass Sie es bereuen werden, wenn Sie differenzielle Updates verwenden (normalerweise binäre Unterschiede von In-Game-Strukturen) und alles verwenden, was nicht in der richtigen Reihenfolge geliefert wird (zuverlässig oder nicht). Leute, die TCP beim Spielen nicht mögen, wissen im Allgemeinen einfach nicht genug darüber (z. B. zu wissen, was NODELAY tut). UDP ist sinnvoll für Dinge wie Sprachdaten, bei denen Pakete außerhalb der Reihenfolge einfach verworfen werden können. Dies ist in einem Spiel selten der Fall.
Coderanger

1
"selten der Fall in einem Spiel"? Vorausgesetzt, der Server gibt mir in jedem Frame maßgebliche Spielzustände, ist es mir egal, was in der Vergangenheit passiert ist. Eine einfache monoton ansteigende Frame-Nummer aus UDP-Paketen ist dafür perfekt. Wie viele Daten benötigen Sie wirklich, um zuverlässig zu übertragen?
ChrisE

2
"Vorausgesetzt, der Server gibt mir in jedem Frame maßgebliche Spielzustände." Sicher, wenn Sie das als gegeben behandeln. Beachten Sie, dass ich sagte "Wenn Sie differenzielle Aktualisierungen verwenden", was das Gegenteil von Stroboskopieren des vollständigen Status in jedem Frame wäre. In einem MMO mit einer beliebigen Komplexität für die Welt wird es schnell unmöglich, so häufig vollständige Updates zu versenden.
Coderanger

1
Selbst wenn Sie den vollständigen Status der sich ändernden Dinge senden, kommt es zu Problemen bei der Lieferung außerhalb der Reihenfolge, bei denen das Zusammenführen von Dingen unmöglich werden kann. Denken Sie an die Aktualisierungen "x = 1, y = 2" und dann "y = 1, z = 2". Wenn diese rückwärts ankommen, möchten Sie die "erste" löschen, damit der Wert von y korrekt ist, aber dann verlieren Sie die Änderung an x.
Coderanger

1
@Adam Aus diesem Grund habe ich gesagt, Sie sollten die TCP-Spezifikation lesen und verstehen, wie die Fensterskalierung funktioniert und wie sie mit der erneuten Übertragung interagiert ;-) Das Umschreiben von TCP ist grundsätzlich immer falsch. Wenn Sie eine zuverlässige und ordnungsgemäße Lieferung wünschen, sollten Sie UDP nicht verwenden.
Coderanger
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.