4

多くの記事を検索して読み、GKTank アップル サンプルを見ました (問題の詳細はわかりません。発生したイベントを処理しているようです)。

ブルートゥース/インターネットを介したマルチプレイヤーゲームで(おそらく)、レイテンシーなどを考慮して正しいゲーム結果が得られるように、プレイヤーのやり取りをどのように同期しますか...

例えば:

Bluetooth 経由で接続された 2 つの別々のデバイスの各プレーヤー A と B にボタンが表示されます

プレーヤー A がボタンを押す (プレーヤー A はゲームをホストしているため、遅延は問題にならない) プレーヤー B はプレーヤー A の直前にボタンを押すが、プレーヤー A のデバイスへの接続には少なくとも 200 ミリ秒のネットワーク遅延がある

問題: ゲームは、プレーヤー A のタッチ要求が最初にゲーム コードに到達する場合でも、プレーヤー B が最初に押されたことを知る必要があります。つまり、ホストしているプレーヤーには利点がありません。

タッチイベントにタイムスタンプがあることはわかっているので、プレスの実際の時間がプレーヤーBからゲームコードに送信されたことを確認できます...しかし、それが正しいアプローチであるかどうか、そしてそこからどこへ行くべきかはわかりません. .

答えは、タッチがすぐに処理されるのではなく、ゲームサイクル内で処理されるゲームの時間サイクルにあると思います...

これに関するヘルプ、またはこれを処理するチュートリアルまたは特定のソースコードへのポインタをいただければ幸いです。

アダム

4

2 に答える 2

2

この質問はhttps://gamedev.stackexchange.com/で行うことをお勧めします。これは、マルチプレイヤーの遅延または遅延に関する一般的な質問であり、特に iPhone に固有のものではないためです。

タイムスタンプを使用して、アクション メッセージを並べ替えることができる場合があります。iPhone は AT&T が管理する日時サーバーに同期されていると思います。

于 2011-01-12T15:05:31.380 に答える
1

マルチプレイヤー ゲームを実際に作成した経験はありません。しかし、ほとんどのゲーム開発の質問の場合と同様に、間違っていることも正しいこともないと思うので、論理的思考がうまくいくはずです.

考慮すべきいくつかの考えを次に示します。

  • プレーヤー A のデバイスで遅延が発生していない場合でも、プレーヤー B を補うためにいくらか導入する必要があります (プレーヤー B の観点からはプレーヤー A も遅れているため、その逆も同様です)。
  • したがって、何らかの「コマンド スタック」を導入して、両方のプレイヤーからの入力をバッファリングし、両方のプレイヤーがゲーム時間の特定の時点で入力を提供する機会を得たらコマンドを実行する必要があります。
  • 実際の遅延を時々測定するために ping コマンドを導入することをお勧めします。
  • 1 つのデバイス (ホスト) のみがレイテンシを測定し、それをクライアントに通知する必要があります。
  • 測定されたレイテンシーに基づいて、スタック内のコマンドのタイム オフセット (ホスト時間に関連する) または遅延を計算します (レイテンシーを使用して、プレーヤー B のタイムスタンプを「ローカル」時間に変換します)。
  • 可能な場合は遅延を動的に保ち、さまざまな遅延を補正します (セッション全体で遅延を測定し続けます)。
  • 実際のレイテンシーが計算されたものを超えた場合、プレーヤー B からのコマンドは遅れてスタックに置かれる可能性があります - とにかく実行されることを確認してください (この時点でラグが発生する可能性があります)
  • 実際には、実際の入力を交換、バッファリング、同期する入力レイヤーと、入力レイヤーから遅延コマンドを受け取るゲームレイヤーの 2 つの「レイヤー」が必要です。

これまでのところ、私の 2 セント ;-)

于 2011-01-12T15:05:52.903 に答える