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
Hacker-News-Kommentar