あなたは同期に関するいくつかの良いアイデアを開始したようですが、重複している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つのプロセスによって「所有」され
の世界は、帯域幅と非表示の待ち時間を最適化するために、あなたは多くの場合、更新頻度の高いフィールドのいくつかの地元のシミュレーションを行うことができます。例:
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)はあなたの問題に合っているようです。もう一度ご質問や詳細が必要な場合は、フォローアップを依頼してください。詳細は
説明をありがとう!!! – user387184
ゲーム時計の説明が私には明らかです。私が正しく理解していれば、基本的にクライアントにサーバーの時刻を送信するので、クライアントはそれに合わせてゲーム時間を調整します。これがBTまたはローカルネットワーク上で発生した場合、同期メッセージにサーバからリーチに要する時間を無視することができます。たとえば、サーバーが時刻123にある場合→クライアントに送信する→クライアントは自分自身の時刻を123に設定することができます(サーバーの時刻を受信してから自分の時刻を更新するまでの遅延は、すべて同じメソッド)これは正しいですか? – user387184
私の残りの質問は、これはAppleのGameCenterを通じて機能するのでしょうか?アップルのGameCenterイントロからは、GameCenterに比べてGKtankのバージョンがあることを理解しています。しかし、2人のプレーヤー間のメッセージに時間がかかる場合、どのように同期するのですか?ゲームは一時停止しますか?再度、感謝します – user387184