7

状況:

BTまたはWebサーバーを使用してマルチプレイヤー1:1ゲームでオブジェクトを同期するための最良のロジックは何ですか?ゲームには2人のプレーヤーがいて、それぞれに複数の銃と弾丸があり、弾丸は動的に作成されてしばらくすると消えます。プレーヤーはオブジェクトを同時に動かします。

問題:

同期に実際の問題があります。一方のデバイスの弾丸は他のデバイスよりも高速である可能性があり、また、一方のデバイスのオブジェクトが空中にある間に、もう一方のデバイスのオブジェクトにすでに移動またはヒットしている可能性があるためです。

可能性?

この場合、同期を処理する最良の方法は何ですか?すべてのオブジェクトがサーバーとして機能する1つのデバイスによって制御され、他のオブジェクトは値と位置を取得するだけで、ほとんど何も考えない場合。または、各デバイスが独自のオブジェクトを作成、破棄、および移動し、同期を介して他のデバイスに通知する場所に制御を分散する必要があります。

BTはWebで再生するよりも高速である可能性があるため、この中で送信遅延を処理するのに最適な方法は何ですか?最高のものは、実用的なサンプルです-どうもありがとうございました!

4

3 に答える 3

10

あなたは同期についていくつかの良いアイデアを始めたようですが、あなたが遭遇している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)はあなたの問題に合っているようです。さらに質問がある場合や詳細が必要な場合は、フォローアップを依頼してください。

于 2011-01-07T19:59:57.443 に答える
1

あるデバイスの弾丸は他のデバイスよりも速いかもしれないので

ゲームが適切に設計されている場合、これは発生しないはずです。

最近のほとんどのゲーム(特にマルチプレイヤーゲーム)は、ティック(小さなタイムスライス)で動作します。各システムは、ティック中に何が起こったかを計算するときにまったく同じ結果を得る必要があります。「弾丸が別のマシンよりも速く移動する」ことはありません。

次に、各システムが各プレーヤーに対して同じ入力を取得することを確認し(各プレーヤーの入力を、入力が登録されたときにチェックマークとともに、他のプレーヤーにブロードキャストする必要があります)、各システムが確認することは、はるかに簡単です。同じレートでティックを計算します。

于 2011-01-07T01:44:26.053 に答える
0

詳細については、この投稿をチェックしてください:- マルチプレイヤーネットワークゲームでの同期?

于 2011-05-12T05:51:30.180 に答える