Es scheint, dass die Designer von Microsoft an neuen Icons fĂŒr die wichtigsten Windows 10-Anwendungen, einschließlich des "Explorers", arbeiten.

Es scheint, dass die Designer von Microsoft an neuen Icons fĂŒr die wichtigsten Windows 10-Anwendungen, einschließlich des "Explorers", arbeiten.
Im Mai dieses Jahres nahm ich als Spieler an der MMO-Veranstaltung KatherineOfSkyteil. Mir fiel auf, dass, wenn die Anzahl der Spieler eine bestimmte Zahl erreicht, einige von ihnen alle paar Minuten "abfallen". GlĂŒcklicherweise fĂŒr euch (aber nicht fĂŒr mich) war ich einer dieser Spieler, die sich jedes Mal, selbst bei einer stabilen Verbindung, abmeldeten. Ich sah das als persönliche Herausforderung an und begann nach den Ursachen des Problems zu suchen. Nach drei Wochen Debugging, Tests und Korrekturen wurde der Fehler schließlich behoben, aber diese Reise war alles andere als einfach.

Die Probleme in Mehrspieler-Spielen sind sehr schwer nachzuvollziehen. Sie treten ĂŒblicherweise unter sehr spezifischen Netzwerkbedingungen und in sehr speziellen Spielsituationen auf (in diesem Fall: mehr als 200 Spieler). Und selbst wenn es gelingt, das Problem zu reproduzieren, ist es nicht richtig debugbar, da das EinfĂŒgen von Kontrollpunkten das Spiel stoppt, Timer verwirrt und normalerweise dazu fĂŒhrt, dass die Verbindung aufgrund von ZeitĂŒberschreitungen abbricht. Aber dank HartnĂ€ckigkeit und eines wunderbaren Werkzeugs namens clumsy konnte ich herausfinden, was passiert.

Kurz gesagt: Aufgrund eines Fehlers und einer unvollstĂ€ndigen Implementierung der Verzögerungssimulation befand sich der Client manchmal in einer Situation, in der er in einem Takt ein Netzwerkpaket senden musste, das aus den Eingaben von Spielern fĂŒr etwa 400 Spielelemente bestand (wir nennen dies "Megapaket"). Danach muss der Server nicht nur alle diese Eingaben korrekt empfangen, sondern sie auch an alle anderen Clients senden. Wenn man 200 Clients hat, wird das schnell zum Problem. Der Kanal zum Server wird schnell ĂŒberlastet, was zu Paketverlust und einem Kaskadeneffekt von erneut angeforderten Paketen fĂŒhrt. Die Verzögerung der Eingabeverarbeitung fĂŒhrt dann dazu, dass noch mehr Clients Megapakete senden, wodurch die Lawine noch stĂ€rker wird. Den glĂŒcklichen Clients gelingt es, sich zu erholen, alle anderen "fallen ab".

Es scheint, dass die Designer von Microsoft an neuen Icons fĂŒr die wichtigsten Windows 10-Anwendungen, einschließlich des "Explorers", arbeiten.
Das Problem war ziemlich grundlegend, und ich habe zwei Wochen gebraucht, um es zu beheben. Es ist recht technisch, deshalb werde ich unten die saftigen technischen Einzelheiten erklĂ€ren. Aber zunĂ€chst mĂŒssen Sie wissen, dass seit Version 0.17.54, die am 4. Juni veröffentlicht wurde, der Mehrspieler unter temporĂ€ren Verbindungsproblemen stabiler ist und die Latenzverdeckung viel weniger fehlerhaft ist (weniger Ruckler und Teleportationen). Außerdem habe ich die Methode zur Verdeckung der Verzögerungen im Kampf geĂ€ndert und hoffe, dass sie dadurch etwas flĂŒssiger werden.

Mehrspieler-Megapaket – technische Einzelheiten

Um es vereinfacht zu erklĂ€ren, funktioniert der Mehrspieler im Spiel wie folgt: Alle Clients simulieren den Spielzustand, indem sie nur die Eingaben der Spieler empfangen und senden (genannt "Input Actions" Input Actions). Die Hauptaufgabe des Servers ist die Übertragung Input Actions und die Kontrolle darĂŒber, dass alle Clients die gleichen Aktionen in einem Takt ausfĂŒhren. Mehr dazu können Sie in dem Beitrag lesen FFF-149.

Da der Server Entscheidungen darĂŒber treffen muss, welche Aktionen ausgefĂŒhrt werden sollen, folgt die Aktion des Spielers ungefĂ€hr diesem Pfad: Aktion des Spielers → Spiel-Client → Netzwerk → Server → Netzwerk → Spiel-Client. Das bedeutet, dass jede Aktion des Spielers erst ausgefĂŒhrt wird, nachdem sie den hin und zurĂŒck gehenden Weg durch das Netzwerk zurĂŒckgelegt hat. Daher wĂŒrde das Spiel schrecklich ruckeln erscheinen, weshalb fast sofort nach dem Erscheinen des Mehrspielermodus ein Mechanismus zur Verdeckung der Latenzen eingefĂŒhrt wurde. Die Latenzverdeckung simuliert die Eingaben des Spielers, ohne die Aktionen anderer Spieler und die Entscheidungen des Servers zu berĂŒcksichtigen.

Es scheint, dass die Designer von Microsoft an neuen Icons fĂŒr die wichtigsten Windows 10-Anwendungen, einschließlich des "Explorers", arbeiten.
In Factorio gibt es einen Spielzustand Game State – das vollstĂ€ndige Bild der Karte, des Spielers, der EntitĂ€ten und allem anderen. Es wird deterministisch in allen Clients basierend auf den vom Server empfangenen Aktionen simuliert. Der Spielzustand ist heilig, und wenn er jemals vom Server oder einem anderen Client abweicht, tritt eine Desynchronisierung ein.

Außerdem Game State Wir haben einen Latenzzustand Latency State. Er enthĂ€lt eine kleine Untermenge des Hauptzustands. Latency State Er ist nicht heilig und stellt einfach dar, wie der Spielzustand in Zukunft basierend auf den Eingaben des Spielers aussehen wird. Input Actions.

DafĂŒr speichern wir eine Kopie der erzeugten Input Actions in der Warteschlange der Verzögerungen.

Es scheint, dass die Designer von Microsoft an neuen Icons fĂŒr die wichtigsten Windows 10-Anwendungen, einschließlich des "Explorers", arbeiten.
Das heißt, am Ende des Prozesses sieht das Bild auf der Client-Seite etwa so aus:

  1. Wir wenden an Input Actions alle Spieler auf Game State so, wie diese Eingabeaktionen vom Server empfangen wurden.
  2. Wir entfernen aus der Warteschlange der Verzögerungen alle Input Actions, die laut den Angaben des Servers bereits auf Game State.
  3. Löschen Latency State angewendet wurden, und setzen es zurĂŒck, damit es genau so aussieht wie Game State.
  4. Wir wenden alle Aktionen aus der Warteschlange der Verzögerungen auf Latency State.
  5. Basierend auf den Daten Game State und Latency State rendern wir das Spiel fĂŒr den Spieler.

All dies wiederholt sich in jedem Takt.

Zu kompliziert? Keine Sorge, das ist noch nicht alles. Um die UnzuverlÀssigkeit von Internetverbindungen auszugleichen, haben wir zwei Mechanismen entwickelt:

  • Verpasste Takte: Wenn der Server entscheidet, dass Input Actions im Takt des Spiels ausgefĂŒhrt werden, aber wenn er von einem Spieler keine Input Actions Informationen erhalten hat (zum Beispiel aufgrund einer erhöhten Verzögerung), wird er nicht warten, sondern diesem Client mitteilen: „Ich habe deine Input Actions, ich werde versuchen, sie im nĂ€chsten Takt hinzuzufĂŒgen.“ Das wurde so gemacht, damit aufgrund von Verbindungsproblemen (oder Problemen mit dem Computer) eines Spielers die Aktualisierung der Karte bei allen anderen nicht verzögert wird. Es ist anzumerken, dass Input Actions nicht ignoriert, sondern einfach verschoben werden.
  • Die verzögerte gesamte Hin- und RĂŒckweg: Der Server versucht zu schĂ€tzen, wie hoch die Verzögerung der DatenĂŒbertragung hin und zurĂŒck zwischen Client und Server fĂŒr jeden Client ist. Alle 5 Sekunden bespricht er gegebenenfalls mit dem Client eine neue Verzögerung (abhĂ€ngig davon, wie sich die Verbindung in der Vergangenheit verhalten hat) und passt die Hin- und RĂŒckĂŒbertragungsverzögerung entsprechend an.

Diese Mechanismen sind an sich recht einfach, aber wenn sie zusammen verwendet werden (was hĂ€ufig bei Verbindungsproblemen geschieht), wird die Logik des Codes schwer handhabbar und es gibt eine Menge GrenzfĂ€lle. Zudem mĂŒssen der Server und die Warteschlange der Verzögerungen, wenn diese Mechanismen ins Spiel kommen, richtig ein spezielles Input Action mit dem Namen StopMovementInTheNextTick. Dadurch wird sichergestellt, dass der Charakter bei Verbindungsproblemen nicht von selbst weglĂ€uft (z. B. unter einen Zug).

Jetzt muss ich Ihnen erklĂ€ren, wie die Auswahl von EntitĂ€ten funktioniert. Einer der ĂŒbergebenen Typen Input Action — dies ist die Änderung des Auswahlstatus der EntitĂ€t. Es informiert alle darĂŒber, auf welche EntitĂ€t der Spieler mit der Maus zeigt. Wie man verstehen kann, ist dies eine der hĂ€ufigsten Eingabemaßnahmen, die von den Clients gesendet werden, daher haben wir es optimiert, um Bandbreite zu sparen, sodass es so wenig Platz wie möglich einnimmt. Dies wird so umgesetzt: Bei der Auswahl jeder EntitĂ€t speichert das Spiel anstelle der absoluten, hochprĂ€zisen Kartencoordinaten eine geringprĂ€zise relative Verschiebung von der vorherigen Auswahl. Dies funktioniert gut, da das Markieren mit der Maus normalerweise sehr nah an der vorherigen Auswahl erfolgt. Daraus ergeben sich zwei wichtige Anforderungen: Input Actions dass sie niemals ĂŒbergangen werden dĂŒrfen und dass sie in der richtigen Reihenfolge ausgefĂŒhrt werden mĂŒssen. Diese Anforderungen werden fĂŒr Game State. Aber da die Aufgabe Latency state darum besteht, "gut genug" fĂŒr den Spieler auszusehen, werden sie im Latenzzustand nicht erfĂŒllt. Latency State berĂŒcksichtigt viele RandfĂ€lle, die mit TaktĂŒberspringen und Änderungen der Hin- und RĂŒcklaufverzögerungen verbunden sind.

Sie können bereits erraten, worauf es hinauslĂ€uft. Schließlich beginnen wir, die Ursachen des Megapakets zu erkennen. Der Grund fĂŒr das Problem liegt darin, dass bei der Entscheidung, ob die Aktion der AuswahlĂ€nderung ĂŒbertragen werden soll, die Logik der Auswahl der EntitĂ€ten auf Latency Stateberuht, und dieser Zustand enthĂ€lt nicht immer die richtigen Informationen. Daher wird das Megapaket ungefĂ€hr so generiert:

  1. Der Spieler hat Verbindungsprobleme.
  2. Es kommen TaktĂŒberspring- und Verzögerungsregelmechanismen ins Spiel.
  3. Die Warteschlange des Latenzzustands berĂŒcksichtigt diese Mechanismen nicht. Das fĂŒhrt dazu, dass bestimmte Aktionen vorzeitig gelöscht oder in der falschen Reihenfolge ausgefĂŒhrt werden, was zu einem fehlerhaften Latency State.
  4. Der Spieler hat kein Verbindungsproblem mehr und simuliert, um mit dem Server aufzuholen, bis zu 400 Takte.
  5. In jedem Takt wird eine neue Aktion zur Änderung der Auswahl der EntitĂ€t generiert und zur Übertragung an den Server vorbereitet.
  6. Der Client sendet ein Megapaket von ĂŒber 400 Änderungen der EntitĂ€tenauswahl an den Server (und auch andere Aktionen wie den Zustand des Schießens, Gehens usw. waren von diesem Problem betroffen).
  7. Der Server erhĂ€lt 400 Eingabeverfahren. Da ihm nicht erlaubt ist, auch nur einen einzigen Eingabeschritt zu ĂŒberspringen, befiehlt er allen Clients, diese Schritte auszufĂŒhren und sie ĂŒber das Netzwerk zu senden.

Die Ironie besteht darin, dass der Mechanismus, der zur Einsparung der Bandbreite des Kanals gedacht war, letztendlich riesige Netzwerkpakete erzeugte.

Wir haben dieses Problem gelöst, indem wir alle GrenzfĂ€lle der Aktualisierung und UnterstĂŒtzung der Verzögerungsschlange behoben haben. Obwohl es ziemlich viel Zeit in Anspruch nahm, hat es sich letztendlich gelohnt, alles richtig umzusetzen, anstatt auf schnelle Hacks zu vertrauen.

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster