7

C# で 2D 空間 RTS ゲームを作成しています。シングルプレイヤーが動作します。次に、マルチプレイヤー機能を追加したいと思います。私はそれをグーグルで検索しましたが、強力なネット接続なしで何千ものユニットを継続的に移動させる唯一の方法があるようです: すべてのプレイヤーで同じシミュレーションを実行しながら、ネットワークを介してコマンドのみを送信します.

そして今、エンジン全体がどこでも double を使用するという問題があります。また、浮動小数点計算はコンパイラの最適化と CPU アーキテクチャに大きく依存するため、同期を維持することは非常に困難です。そして、それはまったくグリッドベースではなく、宇宙船を動かすための単純な物理エンジンを備えています(宇宙船には衝動と角運動量があります...)。そのため、固定小数点を使用するように全体を再コーディングするのは非常に面倒です (ただし、おそらく唯一の解決策です)。

したがって、これまでのところ2つのオプションがあります。

  • 現在のコードに別れを告げ、整数を使用して最初からやり直す
  • 数千のユニットを持つ 8 人のプレーヤーを持つのに十分な帯域幅がある場合にのみゲーム LAN を作成し、(ほぼ) すべてのフレームで位置や方向などを送信します...

だから私はより良い意見を探しています(または、すべてを台無しにすることなくコードを固定小数点に移行するためのヒントさえも...)

4

4 に答える 4

2

確かにすべてのクライアントが同じバイナリを使用するため、コンパイラの最適化は同期の問題には影響しません。

また、1 つのアーキテクチャのみをターゲットにすることを計画している場合 (または、少なくとも同じアーキテクチャ上にいる場合にのみ人々が互いに対戦できるようにする場合)、それも問題ではありません。

iPhone とデスクトップのゲームを開発する C# で浮動小数点を使用してまったく同じことを行いましたが、iPhone が ARM でデスクトップが x86 であっても、どちらも同じ結果が得られます。

ゲームがまったく同じ計算を行うことを確認してください。

他のすべてが失敗した場合はfloat、ゲーム内の のすべてのインスタンスを標準の固定小数点演算クラスに置き換えてください。そうすれば、固定小数点演算の性質がゲームに悪影響を与える可能性がありますが、アーキテクチャ全体で計算が決定論的であることを 100% 確信できます。

于 2009-12-22T20:36:38.163 に答える
1

これへの返信が少し遅れましたが、ゲームのセキュリティの観点から、シミュレーションはサーバー/ホストでのみ実行する必要があります (つまり、クライアントを信頼しないでください。不正行為をしている可能性があります)。

  1. クライアントは自分の動き/コマンドのみをサーバーに送信する必要があります (サーバーは不正な入力を破棄するか、ゲームの制限内にクランプするため、「私は 10,000m/s で走っています」と言うクライアントはサーバーによって 10m/s とクランプされます)。 )。

  2. サーバー/ホストは、視野内で起こっていることのみをクライアントに伝えます (つまり、座標 0,0 のプレイヤーは、200,0 の半径しか見えない場合、2 つの AI が互いに戦っていることについて知らされません彼/彼女の周りに50ユニット)。

帯域幅を節約するのは 2 番目の部分です。サーバー/ホストでのシミュレーションには管理するオブジェクトが数千ある場合がありますが、クライアントは自分の視野内で約 100 または 200 のことを知る必要があるだけです。

この状況での唯一の問題は、クライアントの視野半径よりも範囲が広い可能性のあるダイナミック ファイア (弾丸、ミサイルなど) のようなものです。サーバー/ホストはクライアントに原点と最初の軌道/ターゲット オブジェクトを伝え、クライアントは同じルールに従ってパスをシミュレートしますが、キルはサーバー/ホスト上のシミュレーションでのみ有効です。

クライアント固有のワールド ステートをシリアル化し、送信前に圧縮することも、特にクラス プロパティが必要な場合にのみ Public である場合に、大きなメリットとなります。(私は通常、XML を避けますが、あるアプリケーションでは、XML にシリアライズして圧縮することで、バイナリ形式にシリアライズしてそれを圧縮するよりも、圧縮率を大幅に改善できました。使用される ASCII 文字の範囲が限られていることが、YMMV に影響しているのではないかと思います。)

于 2010-09-01T06:02:43.360 に答える
0

一般的な手法は、すべてのクライアントに現在の状態を他のクライアントに定期的に説明させることです。

おそらく浮動小数点エラーが原因で、2 台のコンピューターがオブジェクトの状態について意見が一致しない場合、ゲームにはどちらが正しいかを判断する何らかのルールがあり、すべてのクライアントはそれに一致するように調整します。

于 2009-12-22T20:37:55.307 に答える
0

具体的には何のためにダブルスを使用していますか? 代わりに 10 進数を使用できますか?

一般的に、サーバーはすべてのプレイヤーユニットの状態 (位置/方向/タイプ) を保存します。

player1 がユニットを移動すると... 移動命令がサーバーに送信されるか... 更新された状態がサーバーに送信されます

プレーヤー クライアントがシーンをレンダリングする必要がある場合、サーバーは要求されたスコープ内のすべてのユニットの位置に関する状態情報を返します。

于 2009-12-23T10:06:11.560 に答える