私は現在、マルチプレイヤープレイを可能にするためにネットワーキングを行っている iOS 格闘ゲームを持っています。私は GameCenter を使用して 2 つのデバイス間でデータを転送していますが、これは後の段階で一度に 4 つのデバイスを処理できるように拡張される予定です。
ネットワークの私のアーキテクチャは次のとおりです。
- 2 つのクライアントが GKMatch を介してお互いを見つけ、乱数生成によって「サーバー」が決定され、もう一方のデバイスが「クライアント」になります。サーバーは、すべてのロジックについて最終決定権を持っています。
-クライアントの場合、キーの押下を検出し、これらの入力をサーバーに送信しています。同時に、クライアント上でこれらの入力を処理し、クライアントが見ている世界を予測 (および表示) しています。これにより、入力が速く感じられ、遅延のないシングル プレイヤー ゲームのようになります。クライアントにはスケジューラがあり、1 秒あたり 10 回発生するように設定されており、現在のゲーム オブジェクトの状態 (すべてのキャラクター/発射体の位置) を保存し、シーケンス番号をインクリメントして配列に保存します。
- サーバーには、「ゲーム オブジェクト」パケットを 1 秒間に 10 回送信するスケジューラがあります。このゲーム オブジェクトには、パケットを送信するたびにインクリメントされるシーケンス番号もあります。
-クライアントは、サーバーからこれらのゲーム オブジェクト パケットを受信し、ゲーム オブジェクト パケットを、同じシーケンス番号の配列内のゲーム オブジェクトと比較します。基本的に、時刻 t のサーバーの世界と時刻 t のクライアントの世界を比較します。矛盾がある場合、クライアントはそのワールドをシーケンス番号で指定された時間にロールバックし、ワールド内のオブジェクトの位置を調整してから、すべてのクライアント キーの押下/入力を再入力して現在の時間に到達します。
私の問題は、サーバー上の 1.0/10.0 スケジューラーが、クライアント上の 1.0/10.0 スケジューラーより遅いことです。送信されているパケットが、クライアントによって保存されているパケットよりも大幅に遅れています。時間が経つにつれて、どんどん時間外に進んでいきます。
とにかく時間を保証するものはありますか?>?