p2pマルチプレイヤーゲームを作成するにはどうすればよいですか?サーバーレスのマルチプレイヤーゲームが欲しいです。しかし、その後、どのようにすべてのクライアントがお互いを知っているのでしょうか?
なぜp2pプロトコルがファイル転送で有名なのにマルチプレイヤーゲームではそうではないのですか?
p2pマルチプレイヤーゲームを作成するにはどうすればよいですか?サーバーレスのマルチプレイヤーゲームが欲しいです。しかし、その後、どのようにすべてのクライアントがお互いを知っているのでしょうか?
なぜp2pプロトコルがファイル転送で有名なのにマルチプレイヤーゲームではそうではないのですか?
回答:
通常、ピアツーピアゲームにはゲームホストがあります。そのゲームホストは、ゲームをマスターゲームリストに投稿し、新しい接続を受け入れます。ゲームホストは、ゲームへの新しいクライアントを受け入れるたびに、既存のすべてのクライアントに新しいクライアントについて通知するため、新しいクライアントに確実に接続できます。
p2pを実装する最も簡単な方法は、ロビーを使用することです。すべてのクライアントは、ロビー(またはチャットルーム)のホストに接続します。ホストの準備ができたら、プレーヤーがスタートボタンを押して、全員が同時にゲームに参加します(通常は戦略ゲームで使用されます)。より複雑なアプローチは、プレイヤーがゲームの途中で参加および退場できる「ドロップインドロップアウト」を使用することですが、これはp2pゲームでの実装がはるかに複雑であり、ホスト移行と呼ばれる機能が必要です。
多くのゲームでは、ほとんどの戦略、スポーツ、運転タイトルなど、ピアツーピアネットワーキングが使用されています。ほぼすべてのXbox360およびPS3ゲームでp2pネットワークが使用されます。クライアント/サーバーアーキテクチャは、主に一人称シューティングゲームまたはMMOゲームで使用されます。
クライアントサーバーは、ゲーム全体の状態を把握していないマシンが1台しかないため、一般的に実装が簡単です。クライアントは、基本的には、物事をスムーズに見せるための予測を備えた単なるレンダラーです。
p2pエンジンを構築する場合、すべてのクライアントはゲームワールドの完全な状態を必要とし、すべてのクライアントは同期を維持する必要があります。
p2pおよびクライアント/サーバーアーキテクチャの詳細については、次の記事を読むことをお勧めします。すべてのプログラマーがゲームネットワーキングについて知っておくべきこと。
また、一般的にネットワークを初めて使用する場合は、そのサイトの他のすばらしい記事をご覧ください。グレンはネットワークの天才です。
ピアツーピアシステムとアクションゲームには興味深い側面がいくつかあります。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人のプレイヤーがアクションを実行すると、コマンド/オーダー(「X、Yに移動」)を他のすべてのプレイヤーに送信し、数分後にシミュレーションのすべてのインスタンスで実行できます。
この状況では、プレーヤーが切断した場合でもゲームを続行できます。サーバー/ホストでゲームを実行する必要がないため、残りのプレーヤーは続行できます。
ただし、ゲームの同期を維持することは簡単ではないため、ゲームロジックの更新には固定のタイムステップを使用する必要があり、乱数ジェネレーターの使用とシードには十分注意して、シミュレーションが発散しないようにする必要があります!
ほとんどのリアルタイム戦略ゲーム(スタークラフトシリーズ、コマンドアンドコンカーシリーズ)および多くのFPSゲーム(コールオブデューティ:モダンウォーフェア2)が使用しているゲームで有名ではないと主張するのは少し不誠実です。
それは、ゲームについてどのように学ぶかは、あなたが使用または作成するマッチメイキング/ロビーサービス次第です。しかし、一度ゲームについて学んだとしても、他のピアよりも同等のピアが1つ以上存在する場合があります。3人のクライアントがプレイしたい場合を考えてみましょう。1人はオープンNATの背後に、2人は厳格な(クローズ)NATの背後にいます。オープンNATピアは、他の2つから接続を取得できます。ただし、2つのストリクトは互いに直接接続することはできません。パケットを中継するには、オープンNATが必要です。オープンNATピアがゲームからドロップした場合、別のリレーを見つける必要があるか、ゲームが中断されます。
おそらく、1人のプレーヤー(「ホスト」と呼びます)を権限のないサーバーとして実行したいでしょう。他のすべてのプレイヤーは、自分たちがやっていることをホストとやり取りし、ホストは他のプレイヤーにメッセージを中継します。
また、ホストしているプレーヤーに接続されているコンピューターのリストを渡して、新しいホストをドロップした場合に何らかの方法で選択し、残りのプレーヤーとの通信を開始することもできます。
smartfoxserverのドキュメントは、あなたを助けたり、ゲームでそれを使いたいと思うかもしれません。個別のクライアントプログラムとサーバープログラムを用意するのではなく、クライアントゲームに埋め込むだけです。
私はこの問題に少し興味があります。あなたは、古典的なクライアントサーバーモデルの代わりにゲームp2pを作成することに多くの問題があると言っています。しかし、私はp2pがクライアントサーバーのようなものであると確信していますが、すべてのピアがサーバーになるチャンスがあります。LAGについて、サーバーとしてマシンをもう1つ追加すると、多くのクライアントがサーバーから遠くなる可能性が高くなりますが、p2pを使用すると、ロビーに余分なマシンはありません。レイテンシテストを管理し、最小限のpingでグループを作成できます。トラフィックの生成について、私が学んだように、クライアントに送信する送信量を少なくするように依頼する必要があります。つまり、クライアントは他のすべてのクライアントが意味することを理解する必要があります。
システム要件の低い比較的シンプルなmmorpgを作成する場合は、ゲームのフォルダーの内容とファイルの構成に基づいて「頻度」を作成する内部プログラムを作成することをお勧めします。これにより、同じ「周波数」を持つ人々が同じチャンネルでプレイできるようになります。改造、操作、または通常のクライアントは分離されます。これはネイティブのハックまたはmodでのみ機能しますが、これはすべての「愚かな」不正行為者をカバーすると確信しています。ある人が言及したエラーチェック方法と組み合わせることで、モデレートはほとんど必要ありません。ポートに関する限り、ポート52225をトリガープロセスなしでルーターに接続し続けるバックグラウンドプロセスでカバーするだけです。