ピアツーピアマルチプレイヤーゲームを作成するにはどうすればよいですか?[閉まっている]


37

p2pマルチプレイヤーゲームを作成するにはどうすればよいですか?サーバーレスのマルチプレイヤーゲームが欲しいです。しかし、その後、どのようにすべてのクライアントがお互いを知っているのでしょうか?

なぜp2pプロトコルがファイル転送で有名なのにマルチプレイヤーゲームではそうではないのですか?


p2pゲームで非常に興味深いのは、MMOに適したネットコードを作成し、より良いソーシャルアスペクトを可能にすることです。サーバーは、5人以上のプレイヤーがいる都市やパーティーにのみ必要です。私は何を実現可能であるとものではありませんがわかりませんが、現在、それは唯一のものより面白いとフォトリアリスティックなグラフィックス...
jokoon

しかし、p2pはマルチプレイヤーゲームで非常に人気があります!誰がそうではないと言った?でも、いくつかの大きなMMOゲームは、P2Pを使用
アダム・ハート

回答:


34

通常、ピアツーピアゲームにはゲームホストがあります。そのゲームホストは、ゲームをマスターゲームリストに投稿し、新しい接続を受け入れます。ゲームホストは、ゲームへの新しいクライアントを受け入れるたびに、既存のすべてのクライアントに新しいクライアントについて通知するため、新しいクライアントに確実に接続できます。

p2pを実装する最も簡単な方法は、ロビーを使用することです。すべてのクライアントは、ロビー(またはチャットルーム)のホストに接続します。ホストの準備ができたら、プレーヤーがスタートボタンを押して、全員が同時にゲームに参加します(通常は戦略ゲームで使用されます)。より複雑なアプローチは、プレイヤーがゲームの途中で参加および退場できる「ドロップインドロップアウト」を使用することですが、これはp2pゲームでの実装がはるかに複雑であり、ホスト移行と呼ばれる機能が必要です。

多くのゲームでは、ほとんどの戦略、スポーツ、運転タイトルなど、ピアツーピアネットワーキングが使用されています。ほぼすべてのXbox360およびPS3ゲームでp2pネットワークが使用されます。クライアント/サーバーアーキテクチャは、主に一人称シューティングゲームまたはMMOゲームで使用されます。

クライアントサーバーは、ゲーム全体の状態を把握していないマシンが1台しかないため、一般的に実装が簡単です。クライアントは、基本的には、物事をスムーズに見せるための予測を備えた単なるレンダラーです。

p2pエンジンを構築する場合、すべてのクライアントはゲームワールドの完全な状態を必要とし、すべてのクライアントは同期を維持する必要があります。

p2pおよびクライアント/サーバーアーキテクチャの詳細については、次の記事を読むことをお勧めします。すべてのプログラマーがゲームネットワーキングについて知っておくべきこと

また、一般的にネットワークを初めて使用する場合は、そのサイトの他のすばらしい記事をご覧ください。グレンはネットワークの天才です。


13

主にラグのために、p2pがゲームで人気がない多くの理由があります。誰もが最も遅いプレーヤーと同じくらい遅いです。ここでは帯域幅についてではなく、ping時間について説明しています。

p2pは大量のデータを転送できますが、非常に高いpingで転送するため、ゲームは最小限のping時間で非常に少量のデータを送信する必要があります。


13

ピアツーピアシステムとアクションゲームには興味深い側面がいくつかあります。Glenn Fiedlerのブログにコメントとして投稿しようとしましたが、明らかに彼は間違っていることを証明したくなく、記事全体を引っ張りました。読みたい場合に備えて、インターネットアーカイブにあります。

彼はコメントをオンラインにさせなかったので、ここで引用します。

最初の投稿からのピアツーピアの提案は、実際には興味深い出発点ですが、それは時々少しナイーブですが、最初の可能性は、あなたの投稿で概説されている予測を備えた標準のクライアント/サーバーモデルとシステムを組み合わせることですゲームネットワーキングについて。P2P pingが低いと、場所に応じてプレイヤー間の予測の遅れが劇的に減少します:効果はおそらくほとんどの米国のゲーマーには表示されませんが、ヨーロッパではほとんどのサーバーで200+のpingが通常であり、直接接続は予測の遅れはヨーロッパのサーバーの予測よりも遅れています。

サーバーを使用しない真のP2Pアプローチはもう少し複雑です:分散ネットワークの主な関心事は、特に、ネットワーク経由で送信されるコマンドのタイミングがわずかに異なることや浮動小数点の問題のためにシミュレーションがバタフライ効果の影響を受ける場合、一貫性を確保することです。これは、各オブジェクト(プレーヤー、NPCなど)の状態を少なくとも定期的にネットワーク化することで可能です。一度にすべてのオブジェクトに対して行う必要はなく、各クライアントは特定のオブジェクトを所有することができます。特定の時間に十分なオブジェクトをネットワーク化することで、1秒以上の同期間隔であっても関係のないオブジェクトの各同期の間に生じる差を弱めることができます。

P2Pシステムの2番目の問題はセキュリティですが、この場合は比較的小さな修正で解決できます。クライアントは物理シミュレーションを使用して、各物理オブジェクトのエラーレベルに関する情報を収集できます。物理を操作すると、常により大きなエラーが発生するため、クライアントは単純に「投票」して、疑わしいオブジェクトを制御しているピアから切断します。さらに、非物理オブジェクトの制御メッセージは、その重要度に基づいてクライアント間で転送されます。プレーヤーの更新はランダムに転送できます。この方法では、プレーヤーは接続されたクライアントの大部分を制御して、目立つ方法でチートを行う必要があります。

[...]

私が参照しているスレッドはhttp://www.devmaster.net/forums/showthread.php?t=14640で見つけることができます

誰かが、この記事のスレッドの1つでピアツーピアにあるファイアウォールの問題に言及したと思います。考えられる解決策は、NATパンチスルーです。
- NATパンチスルーの概要
- ネットワークアドレス変換器を介したピアツーピア通信

100%の成功率はないため、とにかくポートを開くようにプレイヤーに指示する必要があります。


質問に答える人だけに+1してください、ありがとうございます。1つの質問:制御不能状態のバルーニングにおけるバタフライ効果の違いについて言及しました(これは、いくつかの不十分な記述のInterplayゲームで発生しました)。マシン間で状態が異なることがわかった場合はどうすればよいですか?Starcraftを例にとると、私のコンピューターが1つのユニットが死んだと思っているのに、相手のコンピューターが別のユニットが死んだと思ったらどうなるでしょうか?誰の言葉をどのように決めるのでしょうか?
BlueRaja-ダニーPflughoeft

@BlueRaja Starcraftは、エンジンが100%確定的であるため、実際にはこれの良い例ではありません。タイムスタンプ付きのプレーヤーコマンドを確実に送信するだけで、同じプログラムを共有するコンピューターは常に現在の状態に同意します。差異を減らす良い方法は、ゲームタイム(物理フレームまたはティック)で各状態の更新にタイムスタンプを付け、これらのフレームのいくつかを受信マシンにキャッシュすることです。(これに対するほとんどのFPSゲーム、例はCS:SおよびTF2です。)また、重要なものには浮動小数点数を使用しないでください。実装が異なる場合があります。
タムシ

エンジンが100%確定的であり(これを保証する物理ライブラリがあります)、フレームキャッシュを使用してコンピューター間で状態を同期する場合、バタフライ効果は0になります(信頼できる接続を保証できる限り)。利点は、不正なクライアントを比較的簡単に識別できることです。異なる結果を得るための唯一の方法は、異なるコードを持つことです。ネットワークのパフォーマンスに応じて、ゲームのすべての側面でこれが可能になるわけではないことに注意してください。このため、デブリはしばしば同期されません。多くの場合、ペースの速いゲームではすべてを同期できません。
タムシ

ブログの記事があるため、Googleのキャッシュから消えてしまったので、ここでは、インターネットアーカイブにある:web.archive.org/web/20091120214817/http://gafferongames.com/...
fernozzle

9

「真のピアツーピア」ゲームプレイの良い例は、スタークラフトなどのリアルタイム戦略ゲームです。

数百のユニット/発射体が動いているゲームでは、ユニットの位置/状態をネットワーク経由で他のすべてのプレイヤーに繰り返し送信することは実用的ではないため、ここでの1つの解決策は、すべてのプレイヤーが(まったく同じ)シミュレーションを同期して実行することです。

1人のプレイヤーがアクションを実行すると、コマンド/オーダー(「X、Yに移動」)を他のすべてのプレイヤーに送信し、数分後にシミュレーションのすべてのインスタンスで実行できます。

この状況では、プレーヤーが切断した場合でもゲームを続行できます。サーバー/ホストでゲームを実行する必要がないため、残りのプレーヤーは続行できます。

ただし、ゲームの同期を維持することは簡単ではないため、ゲームロジックの更新には固定のタイムステップを使用する必要があり、乱数ジェネレーターの使用とシードには十分注意して、シミュレーションが発散しないようにする必要があります!


5

ほとんどのリアルタイム戦略ゲーム(スタークラフトシリーズ、コマンドアンドコンカーシリーズ)および多くのFPSゲーム(コールオブデューティ:モダンウォーフェア2)が使用しているゲームで有名ではないと主張するのは少し不誠実です。

それは、ゲームについてどのように学ぶかは、あなたが使用または作成するマッチメイキング/ロビーサービス次第です。しかし、一度ゲームについて学んだとしても、他のピアよりも同等のピアが1つ以上存在する場合があります。3人のクライアントがプレイしたい場合を考えてみましょう。1人はオープンNATの背後に、2人は厳格な(クローズ)NATの背後にいます。オープンNATピアは、他の2つから接続を取得できます。ただし、2つのストリクトは互いに直接接続することはできません。パケットを中継するには、オープンNATが必要です。オープンNATピアがゲームからドロップした場合、別のリレーを見つける必要があるか、ゲームが中断されます。


2

オンラインゲーム用のピアツーピアネットワークソリューションであると主張するBadumna(www.badumna.com)もチェックしてください。ゲームの状態の同期は分散された方法で行われているようで、彼らのウェブサイトによると、Flashバージョンがリリースされる予定です。


1

おそらく、1人のプレーヤー(「ホスト」と呼びます)を権限のないサーバーとして実行したいでしょう。他のすべてのプレイヤーは、自分たちがやっていることをホストとやり取りし、ホストは他のプレイヤーにメッセージを中継します。

また、ホストしているプレーヤーに接続されているコンピューターのリストを渡して、新しいホストをドロップした場合に何らかの方法で選択し、残りのプレーヤーとの通信を開始することもできます。

smartfoxserverのドキュメントは、あなたを助けたり、ゲームでそれを使いたいと思うかもしれません。個別のクライアントプログラムとサーバープログラムを用意するのではなく、クライアントゲームに埋め込むだけです。


1
これは、p2pセットアップではなく、即席のサーバー/クライアントのようです。
deft_code

@caspinこれは、すべてではないにしても、ほとんどのP2Pゲームが実行されています。1人のプレイヤーがホストに指定され、残りは彼に接続します。
AttackingHobo

2
@Hobo:ありません P2P、あるクライアント/サーバー、あなたはそれを呼び出すどんなに。
o0 '。

1

私はこの問題に少し興味があります。あなたは、古典的なクライアントサーバーモデルの代わりにゲームp2pを作成することに多くの問題があると言っています。しかし、私はp2pがクライアントサーバーのようなものであると確信していますが、すべてのピアがサーバーになるチャンスがあります。LAGについて、サーバーとしてマシンをもう1つ追加すると、多くのクライアントがサーバーから遠くなる可能性が高くなりますが、p2pを使用すると、ロビーに余分なマシンはありません。レイテンシテストを管理し、最小限のpingでグループを作成できます。トラフィックの生成について、私が学んだように、クライアントに送信する送信量を少なくするように依頼する必要があります。つまり、クライアントは他のすべてのクライアントが意味することを理解する必要があります。


xbox 360のgta4はp2pであるため、可能性があり、ほとんどラグがありません

-1

システム要件の低い比較的シンプルなmmorpgを作成する場合は、ゲームのフォルダーの内容とファイルの構成に基づいて「頻度」を作成する内部プログラムを作成することをお勧めします。これにより、同じ「周波数」を持つ人々が同じチャンネルでプレイできるようになります。改造、操作、または通常のクライアントは分離されます。これはネイティブのハックまたはmodでのみ機能しますが、これはすべての「愚かな」不正行為者をカバーすると確信しています。ある人が言及したエラーチェック方法と組み合わせることで、モデレートはほとんど必要ありません。ポートに関する限り、ポート52225をトリガープロセスなしでルーターに接続し続けるバックグラウンドプロセスでカバーするだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.