私は、物理学を使用したマルチプレイヤーネットワーキングがレーシングゲームでどのように実装されているのか興味があります。私たちは、異なる人々によって制御される複数の高速移動車両で物理的な世界を持っています。車両には武器があり、互いに射撃できるとしましょう(ツイストメタル、Vigilante v8)
ヒットとコリジョンが心配です。権限のあるサーバーまたはより良い代替手段?
私は、物理学を使用したマルチプレイヤーネットワーキングがレーシングゲームでどのように実装されているのか興味があります。私たちは、異なる人々によって制御される複数の高速移動車両で物理的な世界を持っています。車両には武器があり、互いに射撃できるとしましょう(ツイストメタル、Vigilante v8)
ヒットとコリジョンが心配です。権限のあるサーバーまたはより良い代替手段?
回答:
通常、サーバーが使用され、クライアントと定期的に共有される「真実」状態を保存します。衝突はクライアントとサーバーで独立して発生し、クライアントの状態は、通常推測航法と呼ばれるプロセスと同様のプロセスを使用して、以前の状態から推定されます。サーバーの状態がクライアントに到達すると、違いがある場合、クライアントは現在の状態から、ほとんど補間によって受け取った状態に移行します。
ただし、多くのオブジェクトの衝突が実際の問題になる可能性があるため、一般的に行われるのは、クライアントのシミュレーション時間をサーバーのシミュレーション時間よりも少し遅れて、さまざまな柔軟性を追加することです。 ValveのSource Engineネットコードに関するこの記事は非常に説明的です。また、使用するネットワークミドルウェア/ライブラリについて未定の場合は、RakNetとその「ReplicaManager3」コンポーネントを調べることをお勧めします。
できることがいくつかあります。
サーバー上のすべての物理オブジェクトを集中化し、すべてのクライアント上のプレーヤーオブジェクトに座標を同期できます。これは最も簡単で、多くの欠陥なしで動作しますが、多くのリソースを使用し、多くの帯域幅を必要とします。特定の半径内にある他のプレーヤーのプレーヤーにのみ値を送信することにより、帯域幅の使用を最適化できます。
Neensterが述べたように、サーバーとクライアントに物理をシミュレートさせることができます。サーバーはクライアントを修正することがよくあります。これは、すべてのクライアントがすべてのプレイヤーに対して独自の物理を計算することを意味し、サーバー上でキー押下イベントを同期して、すべてのクライアントの各プレイヤーの軌跡を示します。5秒ごとにサーバーが物理シミュレーションをブロードキャストし、すべてのクライアントが変更を受け入れます。これにより、ほとんど目立たないわずかなオフセットが作成される可能性がありますが、ネットワークラグおよびパケット損失(高トラフィックUDPでは避けられない)の間に、プレイヤーおよび/または他のプレイヤーが画面上でグリッチし、位置を迅速かつ途切れることなく変化することに気付くでしょう(語?)。
各クライアントに独自の物理を計算させ、座標を同期させることができます。これにより、クライアント間で共有されるオブジェクトの物理をシミュレートすることが難しくなります。特定のオブジェクトが必ずしもクライアントに属しているわけではないため、おしゃれな何かをしたい場合には、実装するのはかなり複雑な概念です。
最初の方法がおそらく最も簡単で、わずかなラグで約4〜5人のプレイヤーを獲得できるはずです。一致するサーバーごとに一致する必要があります。LANマッチをしている場合、これは先への道です。
2番目の方法がおそらく最も実用的ですが、実装が難しい場合があります。また、サーバーで物理シミュレーションを実行することは非常に機知に富んでいます。サーバーを集中管理している場合、おそらく複数のマシンに負荷を分散する必要があります。サーバーに10個の一致を許可し、一致が最も少ないサーバーに新しい一致を読み込みます。
3番目は間違いなくサーバー上で最もストレスが少なく、ピアツーピアネットワークスキームを実行している場合はおそらく最適なソリューションです。前述したように、プレーヤーオブジェクト以外のオブジェクトは他のクライアントでも変更できるため、同期するのは難しい場合があります。
あなたのゲームがどのように機能するのかわからないので、どちらを使用するかを説明できません。私にできることはあなたに事実を伝えることだけです。さらに質問がある場合は、お気軽にコメントしてください。