Es gibt verschiedene Methoden, um Verzögerungen zu reduzieren oder zu verschleiern, obwohl viele davon ihre Nachteile haben und möglicherweise nicht in allen Fällen anwendbar sind. Wenn eine Synchronisation durch das Spiel selbst nicht möglich ist, können die Clients möglicherweise wählen, auf Servern in geografischer Nähe zu spielen, um die Latenzen zu reduzieren, oder die Server können sich einfach dafür entscheiden, Clients mit hohen Latenzen fallen zu lassen, um sich nicht mit den daraus resultierenden Problemen befassen zu müssen. Dies sind jedoch kaum optimale Lösungen. Stattdessen werden Spiele oft mit Lag-Kompensation entworfen.
Viele Probleme können einfach dadurch gelöst werden, dass man den Clients erlaubt, ihren eigenen Zustand zu verfolgen und absolute Zustände an den Server oder direkt an andere Clients zu senden. Zum Beispiel kann der Client genau angeben, an welcher Position sich der Charakter eines Spielers befindet oder auf wen der Charakter geschossen hat. Diese Lösung funktioniert und wird die meisten Probleme im Zusammenhang mit Lag nahezu eliminieren. Leider beruht sie auch auf der Annahme, dass der Client ehrlich ist. Es gibt nichts, was einen Spieler daran hindert, die Daten, die er sendet, direkt am Client oder indirekt über einen Proxy zu modifizieren, um sicherzustellen, dass er immer seine Ziele trifft. In Online-Spielen kann das Risiko des Schummelns diese Lösung undurchführbar machen, und die Clients werden sich darauf beschränken, relative Zustände zu senden (d. h. in welchem Vektor er sich bewegt oder geschossen hat).
Client-sideEdit
Da die Clients normalerweise den Hauptspielzustand nicht definieren dürfen, sondern ihn vom Server erhalten, besteht die Hauptaufgabe der Client-seitigen Kompensation darin, die virtuelle Welt so genau wie möglich zu rendern. Da Aktualisierungen mit einer Verzögerung kommen und sogar ausfallen können, ist es manchmal notwendig, dass der Client den Spielfluss vorhersagt. Da der Zustand in diskreten Schritten aktualisiert wird, muss der Client in der Lage sein, eine Bewegung auf Basis der verfügbaren Samples abzuschätzen. Um dies zu erreichen, können zwei grundlegende Methoden verwendet werden: Extrapolation und Interpolation.
Die Extrapolation ist ein Versuch, einen zukünftigen Spielzustand zu schätzen. Sobald ein Paket vom Server empfangen wird, wird die Position eines Objekts auf die neue Position aktualisiert. In Erwartung der nächsten Aktualisierung wird die nächste Position basierend auf der aktuellen Position und der Bewegung zum Zeitpunkt der Aktualisierung extrapoliert. Im Wesentlichen geht der Client davon aus, dass ein sich bewegendes Objekt in dieselbe Richtung weiterläuft. Wenn ein neues Paket empfangen wird, kann die Position leicht korrigiert werden.
Die Interpolation funktioniert im Wesentlichen durch das Zwischenspeichern eines Spielzustands und das Rendern des Spielzustands an den Spieler mit einer leichten, konstanten Verzögerung. Wenn ein Paket vom Server eintrifft, beginnt der Client, anstatt die Position eines Objekts sofort zu aktualisieren, die Position zu interpolieren, ausgehend von der letzten bekannten Position. Über ein Interpolationsintervall wird das Objekt gerendert, das sich gleichmäßig zwischen den beiden Positionen bewegt. Idealerweise sollte dieses Intervall genau mit der Verzögerung zwischen den Paketen übereinstimmen, aber aufgrund von Verlusten und variabler Verzögerung ist dies selten der Fall.
Beide Methoden haben Vor- und Nachteile.
- Interpolation stellt sicher, dass sich Objekte nur zwischen gültigen Positionen bewegen und liefert gute Ergebnisse bei konstanter Verzögerung und ohne Verluste. Sollten verworfene oder unvollständige Pakete den Interpolationspuffer überlaufen lassen, muss der Client entweder das Objekt in der Position einfrieren, bis ein neues Paket eintrifft, oder stattdessen auf die Extrapolation zurückgreifen. Der Nachteil der Interpolation ist, dass die Welt mit zusätzlicher Latenz gerendert wird, was die Notwendigkeit einer Form der Lag-Kompensation erhöht.
- Das Problem mit der Extrapolation von Positionen ist ziemlich offensichtlich: Es ist unmöglich, die Zukunft genau vorherzusagen. Es wird die Bewegung nur dann korrekt wiedergeben, wenn die Bewegung konstant ist, aber das wird nicht immer der Fall sein. Spieler können sowohl die Geschwindigkeit als auch die Richtung zufällig ändern. Dies kann zu einem kleinen „Warping“ führen, wenn neue Updates eintreffen und die geschätzten Positionen korrigiert werden, und es kann auch zu Problemen bei der Treffererkennung führen, da Spieler an Positionen gerendert werden können, an denen sie sich eigentlich nicht befinden.
Um einen reibungslosen Spielablauf zu ermöglichen, ist es dem Client oft erlaubt, weiche Änderungen am Spielzustand vorzunehmen. Während der Server letztendlich Munition, Gesundheit, Position usw. festhält, kann es dem Client erlaubt sein, den neuen serverseitigen Spielzustand basierend auf den Aktionen des Spielers vorherzusagen, z. B. indem er einem Spieler erlaubt, sich zu bewegen, bevor der Server auf den Befehl reagiert hat. Diese Änderungen werden im Allgemeinen unter normalen Bedingungen akzeptiert und machen die Verzögerung weitgehend transparent. Probleme treten nur bei hohen Verzögerungen oder Verlusten auf, wenn die Vorhersagen des Clients vom Server sehr auffällig rückgängig gemacht werden. Manchmal, bei geringen Unterschieden, kann der Server sogar „falsche“ Änderungen des Zustands aufgrund von Aktualisierungen des Clients zulassen.
ServerseitigeBearbeitung
Im Gegensatz zu den Clients kennt der Server den genauen aktuellen Spielzustand, so dass eine Vorhersage unnötig ist. Der Hauptzweck der serverseitigen Verzögerungskompensation besteht stattdessen darin, genaue Auswirkungen von Client-Aktionen zu liefern. Dies ist wichtig, da zu dem Zeitpunkt, an dem der Befehl eines Spielers eintrifft, die Zeit weitergelaufen ist und sich die Welt nicht mehr in dem Zustand befindet, den der Spieler sah, als er seinen Befehl erteilte. Ein sehr explizites Beispiel hierfür ist die Treffererkennung für abgefeuerte Waffen in Ego-Shootern, bei denen die Spielräume klein sind und bei unsachgemäßer Handhabung zu erheblichen Problemen führen können.
Zeit zurückspulen
Eine andere Möglichkeit, das Problem anzugehen, besteht darin, vergangene Spielzustände für eine bestimmte Zeit zu speichern und dann die Spielerpositionen bei der Verarbeitung eines Befehls zurückzuspulen. Der Server verwendet die Latenz des Spielers (einschließlich einer inhärenten Verzögerung aufgrund von Interpolation; siehe oben), um die Zeit um einen entsprechenden Betrag zurückzuspulen, um zu ermitteln, was der schießende Client zum Zeitpunkt der Schussabgabe gesehen hat. Dies wird in der Regel dazu führen, dass der Server sieht, dass der Client auf die alte Position des Ziels schießt und somit trifft. Im schlimmsten Fall wird ein Spieler so weit zurückliegen, dass dem Server die historischen Daten ausgehen und er anfangen muss, seine Ziele zu führen.
Dies ist eine WYSIWYG-Lösung, die es dem Spieler ermöglicht, direkt auf das zu zielen, was er sieht. Aber der Preis ist eine Verschärfung der Auswirkungen der Latenz, wenn ein Spieler unter Beschuss steht: Nicht nur die eigene Latenz spielt eine Rolle, sondern auch die des Angreifers. In vielen Situationen fällt dies nicht auf, aber Spieler, die gerade in Deckung gegangen sind, werden feststellen, dass sie länger als ihre eigene Latenz Schaden/Tod-Meldungen vom Server erhalten. Dies kann häufiger zu dem (falschen) Eindruck führen, dass sie durch die Deckung geschossen wurden und zu dem (nicht ganz unzutreffenden) Eindruck von „laggy hitboxes“.
Ein Design-Problem, das sich aus dem Zurückspulen ergibt, ist die Frage, ob das Zurückspulen der verzögerten Befehle eines toten Spielers gestoppt werden soll, sobald er auf dem Server stirbt, oder ob es fortgesetzt werden soll, bis es den Zeitpunkt des Todes „einholt“. Das sofortige Abschalten der Kompensation verhindert, dass die Opfer ihre Mörder posthum angreifen, was den Erwartungen entspricht, aber den natürlichen Vorteil von sich bewegenden Spielern bewahrt, die um eine Ecke kommen, ein Ziel erfassen und es in weniger Zeit töten als eine Rundreise zum Client des stationären Opfers.
Das Zurückspulen kann dafür kritisiert werden, dass die hohe Latenz eines Spielers die Erfahrung von Spielern mit niedriger Latenz negativ beeinflusst. Server mit Lag-Kompensation reduzieren manchmal die Länge des gespeicherten Spielerverlaufs oder erzwingen Ping-Limits, um dieses Problem zu verringern.
Clients vertrauen
Es ist möglich, dass Clients dem Server mitteilen, was sie tun, und dass der Server den Daten, die er erhält, vertraut. Diese Methode wird wegen ihrer Anfälligkeit für Cheats möglichst vermieden: Es ist ein Leichtes, die Netzwerkdaten durch einen zweiten Computer zu leiten, der gefälschte Treffermeldungen einfügt oder bestehende verändert, eine Technik, die von Anti-Cheat-Tools nicht entdeckt werden kann.
Doch die schiere Größe einiger Spiele macht rechenintensive Lösungen wie das Zurückspulen unmöglich. In Battlefield 3 zum Beispiel wird ein „hybrides Hit-Detection“-System verwendet, bei dem die Clients dem Server mitteilen, dass sie getroffen haben, und der Server nur eine vage Plausibilitätsprüfung durchführt, bevor er die Behauptung akzeptiert.
Das Vertrauen in die Ergebnisse eines Clients hat ansonsten die gleichen Vor- und Nachteile wie das Zurückspulen.
Clients extrapolieren lassen
Eine weniger verbreitete Lag-Lösung ist, auf dem Server nichts zu tun und jeden Client extrapolieren zu lassen (siehe oben), um seine Latenz abzudecken. Dies führt zu falschen Ergebnissen, es sei denn, die entfernten Spieler halten eine konstante Geschwindigkeit ein, was denjenigen einen Vorteil verschafft, die hin und her ausweichen oder einfach anfangen/aufhören, sich zu bewegen.
Eine verlängerte Extrapolation führt auch dazu, dass entfernte Spieler sichtbar (wenn auch nicht angreifbar) werden, wenn sie es nicht sein sollten: wenn zum Beispiel ein entfernter Spieler bis zu einer Ecke sprintet und dann abrupt an der Kante stoppt, werden andere Clients ihn für die Dauer ihrer eigenen Latenz weiter ins Freie sprinten lassen. Auf der anderen Seite dieses Problems müssen Clients entfernten Spielern, die sich gerade erst in Bewegung gesetzt haben, einen zusätzlichen Geschwindigkeitsschub geben, um sie in eine theoretisch genau vorhergesagte Position zu schieben.
DesignEdit
Es ist möglich, die Wahrnehmung von Lag durch Spieldesign zu reduzieren. Zu den Techniken gehören das Abspielen von Client-seitigen Animationen, als ob die Aktion sofort stattfinden würde, das Reduzieren/Entfernen von eingebauten Timern auf dem Host-Rechner und das Verwenden von Kameraübergängen, um Warping zu verbergen.