2011-06-21 54 views
4

我已經閱讀了專業XMPP的所有484頁,並閱讀了關於花名冊+ XMPP的無數論壇主題,這個問題仍然是我正在努力解決的問題。我正在尋找有關最佳做法的見解,所以我至少知道要走哪個方向。XMPP多人遊戲:我應該將對手存儲爲名冊聯繫人嗎?

我正在構建一個跨平臺(網頁,iOS & Xbox)的回合制棋盤遊戲。每個玩家在任何特定時刻都可以進行多達100個不同的比賽活動 - 這樣他們就可以輕鬆地從一場比賽中跳出,而不是在那裏轉向一場比賽。

遊戲將設置一個大廳,其中顯示活動遊戲列表,以及該遊戲每個對手的名稱和在線狀態(您可能有多達3個對手,每場比賽總共有4名玩家)。

此外,每個玩家將有一個朋友列表訪問從不同的地區,也列出在線狀態。

我在幕後使用XMPP,對玩家完全透明,沒有人會用Jabber客戶端或任何類型的東西登錄。我完全控制了信息的顯示和利用方式。

我使用XMPP解決的主要問題有:當對手做出舉動,看到我的朋友在線狀態,看到我的對手在線狀態和遊戲內文本聊天時的通知。

所以這裏是我開始有麻煩的地方:顯然你的朋友列表將成爲你名冊中的聯繫人,所以你可以看到他們的在線狀態。但是對手呢?這些通常是隨機的對手,你只會與一個單一的比賽,而不會再次 - 但你與他們的比賽可能會持續2個星期。

記住一切都在幕後(例如:自動訂閱確認等) - 最好的做法是在遊戲進行時將每個對手添加到陣容中的另一個組,然後刪除他們在比賽結束後?那樣,當玩家在線時你會收到狀態通知?或者這是PubSub可以使用的情況嗎?

我也考慮過使用多用戶聊天功能,所以我總是可以訪問每個用戶的在線狀態而無需訂閱,但是在任何給定時刻可能有多達20k的玩家在線時,這似乎遠沒有效率。這絕對聽起來像是移動設備上的電池。

我的其他解決方案是使用共享名單列表。爲每個遊戲創建一個名單,並將該列表分配給每個玩家。然後在遊戲完成後刪除共享名單。

+0

您正在使用哪個XMPP服務器? – Alam

+0

目前ejabberd2的最新穩定版本。昨晚下載並安裝,但我可以切換到任何東西。 –

回答

3

我會選擇在這裏發佈訂閱。當然,這意味着你也必須做一些服務器端的工作。

發送一個directed presence給對手。這將讓他們看到你的存在。

+0

我一直在玩弄實現服務器端解決方案的想法,爲每個遊戲自動創建一個共享名單組,然後將所有玩家添加到其中,並在遊戲完成後將其銷燬。 如果我走這條路線,當玩家在遊戲中時是否應該繼續使用MUC?聊天屏幕位於棋盤旁邊,該遊戲的所有玩家都可以看到它,遊戲中沒有私人信息。 –

+0

我只是用共享名錄做了很多測試,它太脆弱 - 至少在eJabberd2中。說玩家A和B已經訂閱了對方。 A,B和C都一起開始一場比賽,所以一個名單組創建包含所有3名球員。現在,玩家A和B都可以收到玩家C的狀態通知。但是一旦遊戲完成並且我刪除了共享名單組,即便該用戶開啓,也會爲共享名單的所有成員發送「不可用」狀態通知我的全球名冊。它發生在我的應用程序和iChat中。 –

+0

我想我在最後的評論中說得太快了。之前,我只是試圖從共享名單組中刪除我的測試用戶 - 導致「不可用」狀態通知。如果我真的刪除了共享花名冊組,則該組中的每個人都可以在退出之前看到對方的存在。一旦他們再次登錄,共享組不再顯示。看起來這可能是解決方案的一個重要部分。 –

2

我會考慮爲每個遊戲使用多用戶聊天,並且您自己使用MUC協議來處理遊戲狀態消息(對手已經採取行動)。用戶可以在「全球」級別擁有他們的朋友名單,但仍然可以使用MUC級別與他們的對手進行溝通(並接受在線狀態)(除非他們決定將他們添加爲朋友)。

參見:Advantages of Pubsub versus MUC

+0

我確實在想這是一種可能性。如果我有100場比賽,那就意味着我將在打開比賽之後以原子方式加入我的所有100場比賽的MUC。當談到XMPP時,它是否非常高效? 我最關心的是移動設備 - 假設我將爲Obj-C使用一個常見的XMPP庫,並且您有iPhone應用程序用於遊戲開放,您將在遊戲開放時連接到100 MUC。我想確保我採用的方法不會耗盡電池,並且不會影響設備的響應速度。 –

0

我同意在這種情況下使用MUCS(instant)會更好。如果你需要清理不需要的用戶的pubsub節點,這肯定會是一個痛苦的屁股。