1 ポイント 投稿者 GN⁺ 2024-06-14 | 1件のコメント | WhatsAppで共有

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件のコメント

 
GN⁺ 2024-06-14
Hacker News の意見
  • Serious Sam のネットワークコードを実装した開発者だった。QuakeWorld の予測システムに着想を得て、シンプルな MVP をコーディングした。
  • Serious Sam は LAN パーティーで常にうまく動作していた。他のゲームが問題を抱えているときでも安定して動いていた。
  • GB Color 版 Vigilante 8 のマルチプレイを決定論的なゲームプレイで実装した。GBC のリンクケーブルを使って 1 バイトずつデータを送信していた。
  • Croteam は非常に才能あるゲーム開発チームだ。Talos Principle シリーズとカスタムの Vulkan ゲームエンジンを開発した。
  • Age of Empires の「1500 archers on a 28.8」のようなアイデアかと質問している。
  • 技術リソースが増えるにつれて、ソフトウェアがより遅く非効率になっていく現象を指摘している。これを「Benjamin Button ソフトウェアデザイン効果」と呼んでいる。
  • Factorio のアーキテクチャは入力イベントだけを送信し、同期されたシミュレーションコアに依存している。
  • PC Gamer のデモで Serious Sam をプレイしていた記憶を思い出している。今ではクラシックゲームと見なされている。
  • Serious Engine の補間(interpolation)機能を説明している。コンソールで net_bLerping=0 を入力すると、補間なしでゲームをプレイできる。