ネットワーククラスのプロジェクトとして、シンプルなクライアントサーバーリアルタイムマルチプレイヤーゲームを作成したいと思います。
リアルタイムのマルチプレイヤーネットワークモデルについて多くのことを読んでおり、クライアントとサーバーの関係と遅延補償のテクニックを理解しています。
私がしたいことは、Quake 3ネットワークモデルに似たものです。基本的に、サーバーはゲーム全体の状態のスナップショットを保存します。クライアントから入力を受け取ると、サーバーは変更を反映した新しいスナップショットを作成します。次に、新しいスナップショットと最後のスナップショットの差を計算し、それらを同期するためにそれらをクライアントに送信します。
このアプローチは本当に堅実に思えます-クライアントとサーバーが安定した接続を持っている場合、それらを同期させるために必要最小限のデータのみが送信されます。クライアントの同期が外れると、完全なスナップショットも要求できます。
ただし、スナップショットシステムを実装する良い方法を見つけることはできません。シングルプレイヤープログラミングアーキテクチャから離れて、ゲームの状態を次のように保存する方法を考えるのは本当に難しいと思います。
- すべてのデータはロジックから分離されています
- ゲームの状態のスナップショット間の差を計算できます
- ゲームエンティティはコードを使用して簡単に操作できます
スナップショットクラスはどのように実装されますか?エンティティとそのデータはどのように保存されますか?すべてのクライアントエンティティには、サーバー上のIDと一致するIDがありますか?
スナップショットの違いはどのように計算されますか?
一般的に:ゲーム状態のスナップショットシステムはどのように実装されますか?