Serious Engine 1 ソースコード分析
概要
- Serious Sam はマルチプレイヤーゲームとして設計されていた。
- シングルプレイヤーキャンペーンもマルチプレイヤーのように動作する。
- Serious Engine はシングルプレイヤー、マルチプレイヤー、デモの録画と再生をサポートしている。
浮動小数点の決定論
- ゲームの同期のためには、浮動小数点演算の決定論的な動作が重要である。
- Windows のみでリリースされたため、コンパイラ差異による同期問題を避けられた。
- FPU 精度差による問題を解決するため、精度ガードを使用している。
ティック vs フレーム
- ゲームロジックのティックレートはレンダリングのフレームレートと分離されている。
- ゲームロジックは毎秒 20 ティックに固定されている。
- 滑らかな移動とアニメーションのために補間(interpolation)を使用している。
ネットワークマルチプレイヤー
- Serious Engine のネットワーキングモデルはクライアント・サーバー方式である。
- サーバーはクライアントからメッセージを受け取って処理し、関連情報をすべてのクライアントに伝達する。
- UDP プロトコルを使ってパケットを送信する。
パケット層
- UDP パケットは順序が入れ替わったり、到着しなかったりすることがある。
- Serious Engine は UDP の上に独自プロトコルを実装し、信頼性とパケット順序を保証している。
- 信頼できるパケットは ACK パケットによって確認される。
接続ライフサイクル
- クライアントとサーバー間の仮想接続を確立するためにブロードキャストパケットを使用する。
- サーバーはクライアントに固有識別子を割り当て、それを通じてパケットをルーティングする。
オフラインプレイ
- シングルプレイヤーとデモ再生はマルチプレイヤーの特殊ケースである。
- 同一プロセス内でサーバーとクライアントが通信する。
メッセージ層
- CNetworkMessage はストリームのように読み書きできるメッセージ抽象化である。
- メッセージは圧縮可能で、デフォルトでは LZRW1 圧縮を使用する。
- デルタエンコーディングを使ってデータ転送量を最小化する。
メッセージセキュリティ
- メッセージは暗号化されていない。
- チャットメッセージは平文で送信される。
GN⁺の見解
- ゲーム開発者に有用: Serious Engine のネットワーク構造と同期メカニズムは、マルチプレイヤーゲーム開発に役立つ参考資料になりうる。
- 決定論的動作の重要性: 浮動小数点演算の決定論的動作を保証する方法は、ゲーム同期問題を解決するうえで重要な要素である。
- ネットワークプロトコル設計: UDP の上に信頼性と順序を保証する独自プロトコルを実装した点は、ネットワークプログラミングの良い実例である。
- セキュリティ上の考慮事項: メッセージ暗号化がない点は、現代のゲーム開発においてセキュリティ面で考慮すべき事項である。
- 技術的課題: 2000年代初頭のネットワーク環境で高速なマルチプレイヤーゲームを実現した技術的課題を理解する助けになる。
1件のコメント
Hacker News の意見
net_bLerping=0を入力すると、補間なしでゲームをプレイできる。