2012-03-08 32 views
8

我試圖想出在最簡單的遊戲中做一些隨機匹配的最佳方法。僅使用RTMFP進行隨機匹配(Adobe Cirrus)

在使用Adobe Cirrus進行netStreams實驗時,我可以輕鬆設置直接連接,使用Cirrus發送數據,文本,視頻和聲音,這非常棒。我發現獲得一個簡單的P2P連接非常簡單,它的工作原理就像我需要的一樣。

但我真的想只用捲雲所以一切都是P2P雖然實現隨機配對功能...

我怎麼會去同組抓住一個隨機同行......這不是在直接與其他人有聯繫嗎?

一些想法:

-I想也許我可以使用對象複製......當有人連接到的GroupSpecifier,然後我可以推另一個對象爲具有當地的peerID和他們的地位這個共享陣列。那麼我可以在遊戲中改變陣列。但後來我擔心,如果該人員關閉了網絡窗口,則無法保證他們的輸入將被刪除。

- 我還想過只對包含nearID的組做一個「發佈」,其他同行可以獲得帖子......而那些不在遊戲中的人會嘗試直接連接回去。然後,那邊將連接到他們。所以他們都會直接相互聯繫。但是,我覺得如果潛在的100多名「可用」的人獲得了這個職位......那麼他們都試圖連接到一個人,那麼這可能會導致問題。

- 同樣,我想過只是做sendToNearest ...但是難道不認爲不匹配的人的最好方式......因爲你只能有這麼多的鄰居,我認爲......如果有1000人在組。你只能連接到幾個實際上被認爲是你的鄰居的同伴嗎?那麼基本上,你最終可能會與同樣的5-10人匹配,或者在技術上被認爲是鄰居。

+0

整潔的想法!我喜歡頭兩個組合,一個令牌(或n個令牌,基於同行的數量)。每個不匹配的對等體都會在短時間內分配令牌。這是他們連接的機會,所以沒有大量用戶,如果他們不報告結果,他們將被刪除。像老學校令牌環網:) – 2012-04-02 08:17:06

回答

1

我不認爲有什麼辦法可以在匹配節點時避免超時和重試:1)存在未知且可變的網絡延遲; 2)連接可能在未知的時間加入和離開。

所以嘗試連接到另一個節點必須遵守下列狀態參數的任何節點:

  • 我與另一個節點
  • 我有一場比賽未完成的請求匹配
    • 我優秀的匹配要求是到節點X

它必須拒絕傳入匹配請求,如果前兩者中的任何一個爲真(除非傳入的請求來自節點X,並且對同一節點有未完成的請求)。如果兩者都是錯誤的,它可能只會請求比賽。此外,一旦匹配,他們可能需要輪詢他們的合作伙伴或觀察斷開連接消息並作出適當的響應(回到匹配階段,或退出,無論應用程序需要什麼)。

既然如此,您至少可以通過創建排序算法來減少同步節點所需的網絡通信量,以便所有節點提前知道誰最匹配,並嘗試直接連接到它們與最少的網絡流量最佳匹配(沒有廣播發布消息,而不是隨機嘗試)。

這個關鍵是peerID,NetGroup中的每個節點自動獲取。當節點收到鄰居連接消息時,它也包含鄰居節點的唯一peerID。換句話說,每個節點都有一個唯一的名稱(這恰好是一個很大的隨機數),並且知道所有其他節點的唯一名稱。

該peerID很長,有點像256位。您可以使用它創建一個排序順序 - 可能是這樣的:將前32位視爲int,將遠程節點peerID與您自己的peerID進行異或,並將遠程節點從最低排序到最高排序。

因此,現在每個節點對於他們將要連接的人(即使會存在差異,例如基於通過羣傳播的dis /連接消息)具有大致相同的想法。嘗試連接到最佳匹配的節點將遍歷排序列表,可能在連接嘗試失敗之間發生一些隨機超時。

這可能不是理想的解決方案 - 可能存在更好的解決方案,但我想它比隨機嘗試節點或使用廣播消息更好。