2011-01-07 3 views
7

状況は:BTまたはWebサーバーを使用して1ゲーム:Mutliプレーヤーゲームの同期

私は多人数1内のオブジェクトを同期するための最良のロジックは何お願いしたいと思います。ゲームには2人のプレーヤーがいて、それぞれに複数の銃&の弾丸があり、弾丸は動的に作成され、しばらくして消えて、プレイヤーは同時にオブジェクトを動かす。

問題:

つのデバイス上の弾丸が他よりも速いかもしれないので、私は、同期との本当の問題を持っている、また、彼らはすでに、まだ消えていたり、他の上ながら、一つのデバイス上のオブジェクトをヒットしている可能性が空の上に。

可能性はありますか?

この場合、シンクロナイゼーションを処理する最良の方法は何ですか?すべてのオブジェクトは、サーバーとして機能する1つのデバイスによって制御されるべきであり、他のユーザーは、値、ポジションを取得し、思考はほとんどありません。または、各デバイスが独自のオブジェクトを作成、破棄、移動した後、同期によって他のデバイスに通知するように、制御を分散する必要があります。

BTはウェブ上で再生するよりも速いので、これで伝送遅延を処理するには最高の方法はありますか? ベストは作業サンプルです - ありがとう!

答えて

10

あなたは同期に関するいくつかの良いアイデアを開始したようですが、重複している2つの問題、つまりゲームクロックの同期とgamestateの同期が考えられます。

(1)ゲームクロックを同期させる あなたのゲームには「ゲーム時間」の表現が必要です。 2人のプレイヤーのゲームでは、権限を宣言するだけで非常に合理的です。

そう権威クライアント上:他のクライアント上

OnUpdate() 
    gameTime = GetClockTime(); 
    msg.gameTime = gameTime 
    SendGameTimeMessage(msg); 

のようなものかもしれません:

OnReceivGameTimeeMessage(msg) 
lastGameTimeFromNetwork = msg.gameTime; 
lastClockTimeOfGameTimeMessage = GetClockTime(); 

OnUpdate() 
gameTime = lastGameTimeFromNetwork + GetClockTime() - lastClockTimeOfGameTimeMessage; 

行くネットワーク上からの時間を取得すなわち(滑り/スキップなどの合併症があります前進/後退が多すぎる)、さらなる作業が必要ですが、うまくいけばそのアイデアを得ることができます。必要に応じて別の質問をフォローアップしてください。

注:この例では、 'ticks'と 'seconds'は区別されません。また、ネットワークプロトコルやゲームが実行されているデバイスの種類には関係しません(要件 'デバイスにローカル時計があります' )。

(2)gamestateを同期させる 一貫したゲームクロックを設定した後も、一貫してゲームをシミュレートして伝播する方法を検討する必要があります。 gamestateの各ユニットは、1つのプロセスによって「所有」され

  • 非同期:gamestateを同期させるために、あなたはいくつかの選択肢を持っています。そのプロセスだけがそのgamestateを変更することができます。これらの変更は他のすべてのプロセスに伝播されます。

  • すべてが単一のプロセスによって所有されている場合、これはしばしば 'クライアント/サーバー'と呼ばれます。
  • 注:このモデルでは、各クライアントはいつでもゲーム世界の異なる見解を持っています。
  • 例のゲーム:地震、ウォークラフト

の世界は、帯域幅と非表示の待ち時間を最適化するために、あなたは多くの場合、更新頻度の高いフィールドのいくつかの地元のシミュレーションを行うことができます。例:

drawPosition = lastSyncPostion + (currentTime - lastSyncTime) * lastSyncVelocity 

もちろんこの場合は、あなたのシミュレートされたバージョンと新しい情報を調整する必要があります。同期

  • gamestateの各ユニットは、すべてのプロセスにおいて同一です。
  • 各プロセスからのコマンドは、希望の開始時間(将来はいつか)で互いに伝播されます。
  • 最も単純な形式では、1つのプロセス(ホストと呼ばれることが多い)は、ゲーム時間を進める時期を示す特別なメッセージを送信します。誰もがそのメッセージを受け取ると、その時点までゲームをシミュレートすることができます。
  • 'in the future'の要件は、入力コマンドとgamestateの変更の間に高い待ち時間をもたらします。
  • 文明のような非リアルタイムゲームでは、これは問題ありません。スタークラフトのようなゲームでは、通常は入力を認識する音がすぐに出ますが、実際にゲームに影響するアクションは遅れます。このスタイルは時間に敏感なアクションを必要とするシューティングゲーム(〜100msスケール)には適していません。

同期resimulation

  • とgamestateの各ユニットは、すべてのプロセスにおいて同一です。
  • 各プロセスは、現在のタイムスタンプで他のすべてのプロセスにその入力を送信します。さらに、「何も起こっていません」というメッセージが定期的に送信されます。
  • 各プロセスには、gamestateのコピーが2つあります。
  • gamestateのコピー1は、他のすべてのクライアントから受信した「最後の最も古いメッセージ」に伝播します。これは同期モデルと同等ですが、少し前からのgamestateを表す弱点を持っています
  • gamestateのコピー2は、コピー1と残りのすべてのメッセージです。新しいことは何も起こっていないと仮定して、クライアント上の現時点で何がgamestateであるかの予測です。
  • プレイヤーは2 gamestate(理想的には100%のコピー2が、新しいメッセージが来るよう、いくつかの検討がポップを避けるようにしなければならない)
  • 例のゲームのいくつかの組み合わせと相互作用:ストリートファイター4(ネットプレイ)

あなたの説明から、オプション(1)と(3)はあなたの問題に合っているようです。もう一度ご質問や詳細が必要な場合は、フォローアップを依頼してください。詳細は

+0

説明をありがとう!!! – user387184

+0

ゲーム時計の説明が私には明らかです。私が正しく理解していれば、基本的にクライアントにサーバーの時刻を送信するので、クライアントはそれに合わせてゲーム時間を調整します。これがBTまたはローカルネットワーク上で発生した場合、同期メッセージにサーバからリーチに要する時間を無視することができます。たとえば、サーバーが時刻123にある場合→クライアントに送信する→クライアントは自分自身の時刻を123に設定することができます(サーバーの時刻を受信して​​から自分の時刻を更新するまでの遅延は、すべて同じメソッド)これは正しいですか? – user387184

+0

私の残りの質問は、これはAppleのGameCenterを通じて機能するのでしょうか?アップルのGameCenterイントロからは、GameCenterに比べてGKtankのバージョンがあることを理解しています。しかし、2人のプレーヤー間のメッセージに時間がかかる場合、どのように同期するのですか?ゲームは一時停止しますか?再度、感謝します – user387184

1

つのデバイス上の弾丸は、ゲームが適切に設計されている場合、これは起こるべきではない他の

よりも速いかもしれないので。

最近のゲーム(特にマルチプレイヤーゲーム)は、のチック - 小さなタイムスライスで動作します。ティック中に何が起こったのかを計算するとき、各システムはと全く同じという結果を得なければなりません。

次に、各システムが各プレーヤーの同じ入力を取得するようにするのはもっと簡単です(各プレーヤーの入力を他のプレーヤーにブロードキャストする必要があります)各システムが同じ速度でダニを計算することを確認してください。

+0

...残念ながら、ダニを使用して同期するための要件を奪うしません。 GKTankとpunchballの2つの例でも2つのオブジェクトが同期されます。しかし、私はあまりにも多くのオブジェクトを持っているので、そこで使用されたアプローチを拡大することは私のケースでは機能しません。 – user387184