ネットワークモデル
- Quake 3のネットワークモデルはエンジンの中でも最も洗練された部分であり、高速な環境では最初の送信で受信されなかった情報を再送する価値はないことを強調している。
- UDP/IPを使用し、TCP/IPの信頼性ある転送は遅延を引き起こすため使用しない。
- ネットワークスタックは、事前共有鍵を使った暗号化と、事前計算されたハフマン鍵を使った圧縮という、相互排他的な2つの層へと拡張される。
- サーバー側では、UDPデータグラムのサイズを最小化しつつ、UDPの信頼性不足を補うシステムが際立っている。
アーキテクチャ
- クライアント側はシンプルで、各フレームごとにサーバーへコマンドを送信し、ゲーム状態の更新を受け取る。
- サーバーはマスターゲーム状態を各クライアントへ配信する必要があり、UDPパケット損失を考慮しなければならない。
- 主な要素は3つある。マスターゲーム状態、クライアントのコマンドをNetchannel経由で送信すること、そして直近32個のゲーム状態を循環配列に保存するスナップショットである。
スナップショットシステム
- サーバーはクライアントへ更新を送信する際、常にマスターゲーム状態をクライアントの次の履歴スロットにコピーし、ほかのスナップショットと比較する。
- 有効なスナップショットがない場合は「ダミースナップショット」を使って完全な更新を生成する。
- クライアントが以前の更新を受信したことを確認すると、差分更新のみが送信される。
- パケットが失われた場合でも同じプロセスに従い、以前に受信されなかった情報と新しい情報を単一のメッセージとして送信する。
メモリ耐性とC
- Quake3はイントロスペクションなしでスナップショットを比較し、各フィールド位置は配列とプリプロセッサディレクティブによって事前に構成される。
netField_t構造体を使ってフィールドの位置とサイズを定義し、それによって差分をネットワーク越しに送信する。
事前分割
- NetChannelモジュールはメッセージを1400バイトのチャンクに分割して送信し、これによってルーターによるパケットのフラグメンテーションを防ぐ。
- ルーターのフラグメンテーションは、ネットワークに入る際にパケットをブロックし、ネットワークを出る際にはすべての断片を待つ必要があるため、コストが高い。
信頼性のあるメッセージと信頼性のないメッセージ
- スナップショットシステムは、ネットワーク上で失われたUDPデータグラムを補償するが、一部のメッセージやコマンドは必ず配信されなければならない。
- こうした保証はNetChannelを通じて抽象化される。
1件のコメント
Hacker Newsのコメント