あなたは同期についていくつかの良いアイデアを始めたようですが、あなたが遭遇している2つの問題が重複している可能性があります:ゲームクロックの同期とゲーム状態の同期です。
(1)ゲームクロックを同期するには、ゲームの「ゲーム時間」の表現が必要です。2人用ゲームの場合、1人に権限を宣言するのは非常に合理的です。
権威あるクライアントの場合:
OnUpdate()
gameTime = GetClockTime();
msg.gameTime = gameTime
SendGameTimeMessage(msg);
他のクライアントでは、次のようになります。
OnReceivGameTimeeMessage(msg)
lastGameTimeFromNetwork = msg.gameTime;
lastClockTimeOfGameTimeMessage = GetClockTime();
OnUpdate()
gameTime = lastGameTimeFromNetwork + GetClockTime() - lastClockTimeOfGameTimeMessage;
スキップ/スリップ(つまり、ネットワークを介して前後に移動する時間が長すぎる)などの複雑な問題があり、さらに作業が必要になりますが、うまくいけば、アイデアを得ることができます。必要に応じて、別の質問をフォローアップしてください。
注:この例では、「ティック」と「秒」を区別していません。また、ネットワークプロトコルや、ゲームを実行しているデバイスのタイプに関連付けていません(「デバイスにローカルクロックがある」という要件を保存してください)。
(2)一貫したゲームクロックを取得した後でゲーム状態を同期する場合でも、ゲーム状態を一貫してシミュレートして伝播する方法を理解する必要があります。gamestateを同期するには、いくつかの選択肢があります。
非同期
- ゲーム状態の各ユニットは、1つのプロセスによって「所有」されます。そのプロセスのみがそのゲーム状態を変更できます。これらの変更は、他のすべてのプロセスに伝播されます。
- すべてが単一のプロセスによって所有されている場合、これは「クライアント/サーバー」ゲームと呼ばれることがよくあります。
- このモデルでは、各クライアントがいつでもゲームの世界について異なる見方をしていることに注意してください。
- ゲームの例:地震、World of Warcraft
帯域幅を最適化し、レイテンシーを隠すために、更新頻度の高いフィールドに対してローカルシミュレーションを実行できることがよくあります。例:
drawPosition = lastSyncPostion + (currentTime - lastSyncTime) * lastSyncVelocity
もちろん、この場合、シミュレートされたバージョンと新しい情報を調整する必要があります。
同期
- ゲーム状態の各ユニットは、すべてのプロセスで同一です。
- 各プロセスからのコマンドは、希望する開始時間(将来のある時点)で相互に伝播されます。
- 最も単純な形式では、1つのプロセス(多くの場合、ホストと呼ばれます)は、ゲーム時間を進めるタイミングを示す特別なメッセージを送信します。全員がそのメッセージを受信すると、その時点までのゲームをシミュレートすることが許可されます。
- 「将来」の要件により、入力コマンドとゲーム状態の変更の間の待ち時間が長くなります。
- 文明のような非リアルタイムゲームでは、これは問題ありません。スタークラフトのようなゲームでは、通常、入力を確認する音がすぐに鳴りますが、実際のゲーム状態に影響を与えるアクションは遅れます。このスタイルは、時間に敏感なアクションを必要とするシューティングゲームのようなゲームには適していません(約100ミリ秒のスケールで)。
再シミュレーションと同期
- ゲーム状態の各ユニットは、すべてのプロセスで同一です。
- 各プロセスは、他のすべてのプロセスに現在のタイムスタンプを使用して入力を送信します。さらに、「何も起こらなかった」というメッセージが定期的に送信されます。
- 各プロセスには、ゲーム状態の2つのコピーがあります。
- ゲーム状態のコピー1は、他のすべてのクライアントから受信した「最後の最も早いメッセージ」に伝播されます。これは同期モデルと同等ですが、「少し前」のゲーム状態を表すという弱点があります。
- ゲーム状態のコピー2は、コピー1と残りのすべてのメッセージです。これは、新しいことが何も起こらないと仮定した場合の、クライアントの現在のゲーム状態の予測です。
- プレーヤーは、2つのゲーム状態の組み合わせを操作します(理想的には100%コピー2ですが、新しいメッセージが届いたときにポップを回避するために、いくつかの考慮事項を考慮する必要があります)
- ゲームの例:ストリートファイター4(インターネットプレイ)
あなたの説明から、オプション(1)と(3)はあなたの問題に合っているようです。さらに質問がある場合や詳細が必要な場合は、フォローアップを依頼してください。