Apple Game Centerを介してメッセージを交換できるクライアントが2〜3人います。
必要な唯一の同期は、ゲームを同時に開始することです。
これには、クロックの同期が関係していると思います。これを達成するには?
now
あり、メッセージを送信して正確にnow + halfSecond
それから開始する場合、すべてが0.5秒以内にメッセージを受信し、システムクロックが正しく同期されている限り、それらはすべて同時に開始されます。
Apple Game Centerを介してメッセージを交換できるクライアントが2〜3人います。
必要な唯一の同期は、ゲームを同時に開始することです。
これには、クロックの同期が関係していると思います。これを達成するには?
now
あり、メッセージを送信して正確にnow + halfSecond
それから開始する場合、すべてが0.5秒以内にメッセージを受信し、システムクロックが正しく同期されている限り、それらはすべて同時に開始されます。
回答:
スティーブンのコメントは正しいです。これは理論的に不可能です。
幸い、実際には近づくことができます。これがNTPのようなものです。
たとえば、「今すぐ開始」と言って3つのクライアントにメッセージを送信するだけではなく、いくつかのpingメッセージを事前に交換して、クライアントにメッセージが届くまでの時間を測定し、開始メッセージを送信するときに、 「今すぐ開始」の代わりに「Xミリ秒で開始」と言って、メッセージが到着するまでのさまざまな時間に合わせてXを調整します。
例えば。:
インターネット経由でメッセージを送信するのにかかる時間はさまざまであり、各方向で異なる可能性があるため、これは同期を保証できません。1つ目は、測定を数回実行して中央値を読み取ることで、影響を減らすことができます。2番目の方法はトリッキーであり、理論的には解決できない可能性があります(現在のところ、証明を思い出せません)。良いニュースは、おそらくそれほど多くの正確さを必要としないということです。
前述のように、これは不可能であるため、別のアプローチを試します。
専用サーバーがない場合は、参加するクライアントを1つ選択してホストにします(必要に応じて転送できます)。
これでホストは、ヒット検出、AIコントロール、在庫処理などのすべての重要なゲームロジックと、時間追跡(つまり、ゲーム時間の指示)を実行します。
他のクライアントはホストとの同期を維持しようとし、期待値を推定または概算しようとします。ラグが増加したり、パケットが失われたりすると、状況が不安定になる可能性がありますが、追いつくのは簡単で、基本的には次の更新を待つだけです。
ほとんどのゲーム(特にFPS)は、プレイヤー自身の動き、発砲されるショットなどについて独自のローカル計算を行うことでこの事実を隠し、ゲームの遅延を回避しています。すべてはまだサーバーデータに基づいて修正されます。これは、混乱を招く可能性があります。たとえば、自分が敵を撃っているのを見るのと同じですが、(敵が命中することなく)死ぬのと同じ瞬間ですが、それでも完全同期よりはるかに優れたアプローチです。
それでもすべてを同期したままにする場合は、おそらく何らかのステップまたはフレームカウンターを作成する必要があります。そのため、すべてのクライアントが1つのロジックステップのみを処理してから、データを同期します。これは両方の帯域幅になることに注意してください。集中的でラグが大きいので、他に大量のデータがあり、ゲームプレイがターンベース(たとえば、砲兵/ウォームスタイルゲーム)でない限り、これを行うことはお勧めしません。