4

概要:

物理エンジンとして Box2D を使用した 50% 完成した 2D サイドスクローラーは、最終バージョンでマルチプレイヤーをサポートする必要があります。ただし、現在のコードは 1 人用のゲームです。

  • 私は今どうすればいい?
  • さらに重要なことに、マルチプレイヤーを実装してシングルプレイヤーと組み合わせるにはどうすればよいですか?
  • シングルプレイヤー モードをマルチプレイヤー モードから分離してコーディングするのは悪い考えですか ( Notch が Minecraft で行ったように)?

シングルプレイヤーでのパフォーマンスは可能な限り優れている必要があります (シングルプレイヤー モードを実装するためにループバック サーバーを使用して物理学をシミュレートすると、問題が発生する可能性があります)。

完全な背景 / 質問:

私は C++ で比較的大規模な 2D ゲーム プロジェクトに取り組んでおり、その中核要素として物理学を使用しています。(そのためにBox2Dを使用します)

完成したゲームはマルチプレイヤーを完全にサポートするはずですが、ネットワーク部分を適切に計画していなかったというミスを犯し、基本的に今までシングルプレイヤー ゲームに取り組んでいました。

マルチプレイヤー サポートは、ほぼ完成したシングルプレイヤー ゲームに比較的簡単かつ明確な方法で追加できると考えていましたが、明らかに、私が読んだ限りではこれは間違っています。

マルチプレイヤー ゲームは最初から 1 つとしてプログラムする必要があることも読みました。シングルプレイヤー モードは、実際には目に見えないローカル サーバーをホストし、ループバック経由で接続するだけで構成されています。(私は、ほとんどの FPS ゲーム エンジンがそのようにしていることを知りました。例は Source です)

これで、2D 横スクロール ゲームを半分完成させましたが、どうすればよいかわかりません。

シングルプレイヤー/クライアントで作業を続けるだけでは、後でさらに再コーディングしてリファクタリングする必要があるため、今では役に立たないように思えます。

まず、このような状況に陥った可能性のある方への一般的な質問:

  • どのように進めればよいですか?

次に、より具体的なものです。ゲームのネットワーク部分にどのようにアプローチできるかを見つけようとしています。

  • シングルプレイヤー用の見えない / ループバック サーバー

これには、基本的にシングルプレイヤー モードとマルチプレイヤー モードの間に違いがないという利点があります。追加のコードはほとんど必要ありません。

大きな欠点: シングルプレイヤーでのパフォーマンスとその他の制限。2 つの物理シミュレーションが実行されます。1 つはクライアント用、もう 1 つはループバック サーバー用です。

たとえば、スレッドによる直接通信を通じて、ループバック サーバーからのデータに直接パスを提供することで回避したとしても、シングル プレイヤーは制限されます。

これは問題です。なぜなら、人々は一度に大量のオブジェクトをいじることを許可されるべきだからです。

  • 分離されたシングルプレイヤー/マルチプレイヤーモード

シングルプレイヤー モードに関与するサーバーはありません。

これがどのように機能するかはよくわかりません。しかし、シングルプレイヤー機能のすべてを再実装するか、マルチプレイヤーモードに接着する必要があるため、少なくとも多くの追加作業が必要になると思います.

  • シングルプレイヤー用のモジュールとしてのマルチプレイヤーモード

これは私が簡単に考えたにすぎません。マルチプレイヤーは、追加のネットワーク モジュールをロードしてサーバーに接続したシングルプレイヤー ゲームで構成できます。このモジュールは、データを送受信し、シングルプレイヤーの世界を更新します。

振り返ってみると、マルチプレイヤー モードを以前に計画しなかったことを後悔しています。私はこの時点で本当に立ち往生しています。誰かが私を助けてくれることを願っています!

4

2 に答える 2

2

NotchはSPとSMPを別々に開発することの苦痛を感じていると思います。特に彼がBukkit開発チームに「シングルプレイヤー用のローカルサーバー」アプローチへの移行を計画していると言ったので(あなたが言ったように、ソースエンジンのように)。

複数の物理シミュレーションを実行する必要がある理由はありません。ローカルサーバーとクライアント間の遅延はごくわずかであり、ラグ補正は完全に無効になっている可能性があります。

この時点で使用できる基本的なモデルは2つあります。ゲームのすべての頭脳を実行し、クライアントが接続できるようにする専用サーバープログラムです。ゲームが基本的にユーザー設定に応じてサーバーまたはクライアントとして機能できるリッスンサーバー。個別のサーバープログラムはありません。

クライアントを作成する最も簡単な方法は、オブジェクトに「ダミー」フラグを追加して、それらのダミーがサーバーによって直接制御されるようにすることです。次に、補間に移動します。(60 Hzでオブジェクトの更新を送信するのは非現実的であるため、ポイント間をスムーズにすると、見栄えがよくなります。ソースは、少し人工的なラグを追加することでこれを行います。これまでに、標準以下のインターネット接続でGTA4マルチプレイヤーをプレイしたことがある場合は、効果を確認できます。高速車でやり過ぎです。)

また、お勧めの記事:http: //developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

于 2011-02-27T19:54:59.000 に答える
1

ダムレンダリングターミナルアプローチを使用できます。利点は、最初からエンジンに設計しなくても比較的簡単に統合できることです。不利な点は、予測技術を使用して遅延が補償されないことと、可視オブジェクトが多数ある場合、帯域幅が高くなる可能性があることです。

1 つのアイデアは、ゲームの状態とその進化をグラフィックから分離することです。したがって、各フレームでゲームの状態をグラフィック表現に変換します (オフスクリーンのものをカリングします)。次に、シングルプレイヤーではそれを直接レンダリングし、マルチプレイヤーではそのグラフィック表現をネットワーク経由で送信します。そして、入力をネットワーク経由でサーバーに送信しました。

それがどれだけうまく機能するかは、描画されるオブジェクトの数と、それらのグラフィック記述がどれほど複雑かによって異なります。しかし、その説明は通常、2D ゲームではかなり小さいものです。

遅延と帯域幅が良好な LAN でうまく機能することを期待しています。インターネット上でどれだけうまく機能するかわかりません。


アンリアル ネットワーク コードがどのように機能するかを説明するドキュメントを次に示します。また、イントロダクションでは、いくつかのより単純なアプローチについて説明しています。それらのいずれかを実装することをお勧めします。 http://unreal.epicgames.com/Network.htm

于 2011-02-27T19:39:11.377 に答える