2011-11-30 11 views
12

私は、発射と落下ブロックでモバイル(3G帯域幅)でクロスクロスプレートゲームを回すことを考えて、これを行うための最良の方法を見つけようとしています。マルチプレイヤーゲームで物理学を同期する方法は?

あるデバイス(現在のプレーヤーのturn =サーバーの役割)が物理を実行し、いくつかの「キーフレーム」データ(位置、ブロックの向き)を他のデバイスに送信することができます。 「キーフレーム」が受信されました。 この方法では、他のプレーヤーのデバイスで同じビジュアルを保証するために膨大な量のデータが残っていることを非常に恐れています。

もう1つの方法は、物理データ(強制、加速など)を送信し、他のデバイス上で物理を実行することです。ただし、同じ結果を得られないことは恐れています。

+0

オブジェクトが同じ開始位置を持ち、同じフィジックスデータが適用されている場合、オブジェクトは両方のデバイスでまったく同じ結果になりませんか? – Kjetil

+0

@Kjetilは、ティックタイムが固定されている場合のみです。これは一般に、各グラフィックスフレーム上の物理を更新する場合には当てはまりません。 –

+0

右ロブ。私は確信していませんが、問題はクロスプラットフォーム(異なるアーキテクチャ)と浮動小数点計算を考慮する必要がありますか? –

答えて

9

私の現在の実装では、次のように動作します。

  1. Serverは、任意のオブジェクトのいずれかの主要な衝突に物理シミュレーション
  2. を管理し、オブジェクトの絶対位置、回転、および速度/加速/力が各クライアントに送信されます。
  3. クライアントは、各オブジェクトを速度とともに位置に設定し、必要な力を適用します。
  4. クライアントはレイテンシを計算し、その量だけ遅れ時間に対応するようにフィジックスシステムを進めます。

これは、私にとって、非常にうまくいきます。物理システムは、数十のサブシステム(マップ)上で動作しています。私の実装について

いくつかの重要な事柄:

は完全に「必要」としてフラグ付けされていない任意のオブジェクトを無視します。例えば、プレーヤーの動きや草や水に反応する汚れやほこりの粒子は、プレーヤーの動きに反応します。基本的に非本質的なもの。

これはすべてUDP経由で送信されます。これはTCP上で恐ろしいでしょう。

6

絶対的な位置と回転を送信したいと思うでしょう。

あなたは正しいです、あなたが力を単に送るなら、それは動作しません。この作業を行うことは可能ですが、単なる位置を送信するよりもはるかに困難です。両方のデバイスが同じ方法で計算を行う必要があるので、各フレームの前に、他のデバイスからの入力を待つ必要があります。同じタイムステップを使用する必要があります。スクリプトは同じ順序で実行するか、両方のマシンで同じ結果が得られることが保証されているCPU命令しか使用できません。

最後の1つは、浮動小数点数(浮動小数点数/単精度、2倍)を使用できないため、特に問題になります。整数を使用するか、独自の数値形式を使用する必要があるため、既存の多くのツールを利用することはできません。

多くのゲームでは、クライアント側の予測を伴うクライアント/サーバーモデルが使用されます。あなたのゲームがターンベースであれば、クライアントサイドの予測を使わないで逃げることができます。代わりに、クライアントの時間がある程度遅れている可能性があります。そのため、レンダリングに行くときにサーバの入力がすでにそこにあることをかなり確信で​​きるようになります。クライアント側の予測は、クライアントがサーバーの気になる変更(移動など)を行うことができる場合にのみ重要です。

+0

各フレームの入力を待つことによって、すべての物理フレームを意味しますか? – RobotRock

+0

私はすべての入力フレームを意味します。これは、物理フレームと1対1となる可能性があります。入力フレームと物理フレームを1対1にするのが最も簡単ですが、必要に応じて入力をサンプリングするたびに物理学を2回更新することができます。 – notallama

関連する問題