1 Punkte von GN⁺ 2024-11-24 | 1 Kommentare | Auf WhatsApp teilen

Netzwerkmodell

  • Das Netzwerkmodell von Quake 3 ist der eleganteste Teil der Engine und betont, dass Informationen, die bei der ersten Übertragung in einer schnellen Umgebung nicht empfangen wurden, eine erneute Übertragung nicht wert sind.
  • Es verwendet UDP/IP; die zuverlässige Übertragung von TCP/IP wird wegen der dadurch verursachten Latenz nicht genutzt.
  • Der Netzwerk-Stack wird um zwei sich gegenseitig ausschließende Schichten erweitert: Verschlüsselung mit vorab geteiltem Schlüssel und Komprimierung mit vorab berechneten Huffman-Schlüsseln.
  • Bemerkenswert ist das System auf Serverseite, das die Größe der UDP-Datagramme minimiert und zugleich die mangelnde Zuverlässigkeit von UDP ausgleicht.

Architektur

  • Die Client-Seite ist einfach: In jedem Frame sendet sie Befehle an den Server und erhält Aktualisierungen des Spielzustands.
  • Der Server muss den maßgeblichen Spielzustand an jeden Client verteilen und dabei UDP-Paketverlust berücksichtigen.
  • Drei Hauptelemente: der maßgebliche Spielzustand, die Übertragung der Client-Befehle über den Netchannel und Snapshots, die die 32 zuletzt verwendeten Spielzustände in einem Ringpuffer speichern.

Snapshot-System

  • Wenn der Server Aktualisierungen an den Client sendet, kopiert er den maßgeblichen Spielzustand immer in den nächsten History-Slot des Clients und vergleicht ihn mit anderen Snapshots.
  • Wenn kein gültiger Snapshot vorhanden ist, wird ein "Dummy-Snapshot" verwendet, um ein vollständiges Update zu erzeugen.
  • Wenn der Client bestätigt, dass er ein vorheriges Update empfangen hat, werden nur Teilaktualisierungen gesendet.
  • Selbst wenn Pakete verloren gehen, folgt derselbe Prozess und sendet zuvor nicht empfangene Informationen zusammen mit neuen Informationen in einer einzigen Nachricht.

Speicherresilienz und C

  • Quake 3 vergleicht Snapshots ohne Introspection; die Position jedes Feldes wird im Voraus über Arrays und Präprozessor-Direktiven festgelegt.
  • Die Struktur netField_t wird verwendet, um Position und Größe der Felder zu definieren und so Unterschiede über das Netzwerk zu übertragen.

Vorab-Splitting

  • Das NetChannel-Modul teilt Nachrichten in 1400-Byte-Chunks auf, bevor sie gesendet werden; so wird verhindert, dass Router Pakete fragmentieren.
  • Router-Fragmentierung ist teuer, weil sie beim Eintritt ins Netzwerk Pakete blockiert und beim Verlassen des Netzwerks darauf warten muss, dass alle Fragmente eintreffen.

Zuverlässige und unzuverlässige Nachrichten

  • Das Snapshot-System gleicht im Netzwerk verlorene UDP-Datagramme aus, aber einige Nachrichten und Befehle müssen zwingend zugestellt werden.
  • Diese Garantie wird über NetChannel abstrahiert.

1 Kommentare

 
GN⁺ 2024-11-24
Hacker-News-Kommentar
  • Dieser Artikel ist sehr interessant, ebenso wie die vorherigen Artikel. Aber die aktuelle Arbeit ist langweilig, sodass keine Energie für Hobbyprojekte übrig bleibt.
  • Den Begriff „Isochronous“ habe ich zum ersten Mal gehört, als FireWire herauskam; er wurde zur Rechtfertigung der Verwendung von UDP erwähnt. Er ist auch in den heutigen USB-/Thunderbolt-Spezifikationen ein wichtiger Bestandteil.
  • Link zum ersten Artikel der Reihe: https://fabiensanglard.net/quake3/index.php
  • Die Latenzvorhersage und -korrektur ist interessant und verwendet keine komplexe Operational Transformation (OT). Das ist einfacher, und der gemeinsame Zustand braucht eine unabhängige Quelle der Wahrheit statt eines kollaborativ bearbeiteten Dokuments; außerdem ist die Entwicklung schneller und die Performance besser.
  • Der Netzwerkcode des ursprünglichen Q3A-Clients funktionierte im LAN gut, war beim Spielen über Distanz jedoch empfindlich gegenüber Latenz. Eine der interessanten Änderungen in Quake Live war aktualisierter Netzwerkcode für Remote-Play. Auch Internetverbindungen haben sich im Laufe der Zeit insgesamt verbessert.
  • Die Seite scheint unter dem HN Hug of Death zu leiden: <Verbindungs-Timeout>
  • Ein guter Text zum Lesen an einem Samstagmorgen bei einem langsam getrunkenen Matcha. Eine der kleinen Freuden des Lebens.
  • F: Gibt es Ressourcen, um moderne Ansätze für Echtzeit-Spielprotokolle zu lernen?
  • Vermutlich wird auch die Snapshot-ID-Nummer an den Client gesendet und dort bestätigt?
  • Gibt es noch kugelsichere Open-Source-Middleware?