8

シンプルなゲームでランダムなマッチメイキングを行う最良の方法を考え出そうとしています。

Adobe Cirrus を使用して netStreams を試している間、直接接続を簡​​単にセットアップし、データ、テキスト、ビデオ、サウンドをすべて Cirrus を使用して送信できます。シンプルな P2P 接続を確立するのは非常に簡単で、必要に応じて機能します。

しかし、私は本当に巻雲のみを使用してランダムなマッチメイキング機能を実装したいので、すべてが p2p を介して行われます...

同じグループ内のランダムなピアを取得するにはどうすればよいでしょうか...それはまだ他の誰かと直接接続していませんか?

いくつかのアイデア:

-オブジェクトのレプリケーションを使用できるのではないかと考えていました...そして、誰かがGroupSpecifierに接続すると、ローカルのpeerIDとそのステータスを持つこの共有配列に別のオブジェクトをプッシュできます。次に、ゲーム中に配列を変更するだけです。しかし、その人がウェブウィンドウを閉じただけでエントリが削除されるという保証はないのではないかと心配しています.

-nearID を含むグループに「投稿」することも考えました。他のピアは投稿を取得できます...そして、ゲームに参加していないピアは直接接続しようとします。次に、その側がそれらに接続します。したがって、両者は互いに直接接続されます。しかし、潜在的に何百人もの人々が「利用可能」であると...投稿を取得し...そして、彼ら全員が1人の人に接続しようとすると、問題が発生する可能性があると思います.

-また、sendToNearest を実行することも考えました...しかし、それは人々を一致させるための最良の方法ではないでしょうか...なぜなら、私が思うに、非常に多くの隣人しか持てないからです...グループに 1000 人がいた場合. 実際に隣人と見なされる少数のピアにしか接続できないでしょうか?その後、基本的には、同じ 5 ~ 10 人と一致するか、技術的には隣人と見なされます。

4

1 に答える 1

1

1) 不明で可変のネットワーク遅延があり、2) 接続が不明な時間に参加および離脱する可能性があることを考えると、ノードを照合する際のタイムアウトと再試行を回避する方法はないと思います。

したがって、別のノードに接続しようとするノードは、次のステートフル パラメータを保持する必要があります。

  • 私は別のノードと一致しています
  • 未解決のマッチリクエストがあります
    • 私の未処理のマッチ リクエストはノード X に対するものです

最初の 2 つのいずれかが true の場合、着信する一致リクエストを拒否する必要があります (着信リクエストがノード X からのもので、同じノードへの未処理のリクエストがある場合を除く)。両方が false の場合にのみ一致をリクエストできます。

さらに、一致すると、パートナーをポーリングするか、切断メッセージを監視して適切に応答する必要がある場合があります (アプリケーションが必要とする場合は何でも、一致フェーズに戻るか、終了します)。

その場合、ソート アルゴリズムを作成することで、ノードの同期に必要なネットワーク トラフィックの量を少なくとも減らすことができます。これにより、すべてのノードが最適な一致が誰であるかを事前に認識し、最適な一致に直接接続しようとします。最小限のネットワーク トラフィック (ブロードキャスト ポスト メッセージなし、ランダム試行なし)。

これの鍵となるのは、NetGroup 内のすべてのノードが自動的に取得する peerID です。ノードが NeighborConnect メッセージを受信すると、近隣ノードの一意の peerID も含まれます。言い換えれば、すべてのノードには一意の名前 (基本的に大きな乱数) があり、他のすべてのノードの一意の名前を知っています。

この peerID は長く、256 ビットのようなものです。それを使用してソート順を作成できます-おそらく次のようなものです:最初の32ビットをintと見なし、リモートノードのpeerIDを独自のpeerIDでXORし、リモートノードを最低から最高にソートします。

したがって、すべてのノードは、接続先についてほぼ同じ考えを持っています (たとえば、グループを介して伝播する切断/接続メッセージに基づいて違いはありますが)。ノードはソートされたリストをトラバースして、最適な一致に接続しようとします。おそらく、失敗した接続試行の間にランダムなタイムアウトが発生します。

これはおそらく理想的な解決策ではありません - おそらくもっと良い解決策が存在しますが、ランダムにノードを試したり、ブロードキャストメッセージを使用したりするよりは良いと思います.

于 2012-04-17T19:11:27.620 に答える