XMPP多人游戏:我应该将对手储存为名单联系人吗?

XMPP多人游戏:我应该将对手储存为名单联系人吗?,xmpp,Xmpp,我已经阅读了所有484页的专业XMPP,阅读了无数关于rosters+XMPP的论坛帖子,这个问题仍然是我努力解决的问题。我在寻找对最佳实践的见解,所以我至少知道应该朝哪个方向走 我正在构建一个基于回合的跨平台(web、iOS和Xbox)棋盘游戏。每个玩家在任何时刻都可以有多达100场不同的比赛处于活动状态,因此他们可以轻松地从一场没有比赛的比赛跳到另一场比赛 游戏将设有一个大厅,在那里显示您的活动游戏列表,以及该游戏中每个对手的姓名和在线状态(您最多可以有3个对手,每场游戏总共4名玩家) 此外

我已经阅读了所有484页的专业XMPP,阅读了无数关于rosters+XMPP的论坛帖子,这个问题仍然是我努力解决的问题。我在寻找对最佳实践的见解,所以我至少知道应该朝哪个方向走

我正在构建一个基于回合的跨平台(web、iOS和Xbox)棋盘游戏。每个玩家在任何时刻都可以有多达100场不同的比赛处于活动状态,因此他们可以轻松地从一场没有比赛的比赛跳到另一场比赛

游戏将设有一个大厅,在那里显示您的活动游戏列表,以及该游戏中每个对手的姓名和在线状态(您最多可以有3个对手,每场游戏总共4名玩家)

此外,每个玩家都有一个可以从不同区域访问的好友列表,该列表还列出了在线状态

我在幕后使用XMPP,对玩家完全透明,没有人会使用Jabber客户端或类似的东西登录。我完全可以控制信息的显示和使用方式

我使用XMPP解决的主要问题是:对手移动时的通知、查看我的朋友在线状态、查看我的对手在线状态以及游戏中的文本聊天

这就是我开始遇到麻烦的地方:很明显,你的好友列表将是你花名册中的联系人,所以你可以看到他们的在线状态。但是对手呢?他们通常是随机的对手,你只会和他们打一场比赛,以后再也不会和他们打了——然而你和他们的比赛可能会持续两周

请记住,一切都是在幕后进行的(例如:自动订阅确认等)——最好的做法是在游戏进行期间将每个对手添加到您的名册中的另一组,然后在游戏完成后将其移除吗?这样,当玩家在线时,你会收到状态通知吗?或者这是一种可以利用PubSub的情况

我还考虑过使用多用户聊天,这样我就可以随时访问每个用户的在线状态,而无需订阅,但在任何给定时刻都可能有多达2万名玩家在线的情况下,这似乎远远不够有效。当然,在移动设备上,这听起来也像是一个耗电大户


我的另一个解决方案是使用共享名册列表。为每场比赛创建一份名单,并将名单分配给每个球员。然后,在游戏完成后删除共享名单。

< P>我会考虑使用多用户聊天的每一个游戏,以及你自己的扩展到MUC协议来处理游戏状态消息(对手已经采取行动)。用户可以拥有“全局”级别的朋友名册,但仍然可以使用MUC级别与对手进行交流(并获得存在感)(除非他们决定将他们添加为朋友)


另请参见:

我将在此处选择Pubsub。当然,这意味着您也必须做一些服务器端的工作


给对手发一封信。这将允许他们看到您的存在。

我同意在这种情况下使用MUCS(即时)会更好。如果您需要清理不需要的订阅者的子节点,这肯定会让人头疼。

我肯定会考虑这一可能性。如果我有100场比赛,那就意味着我会在比赛开始时加入MUC,参加我所有的100场比赛。当涉及到XMPP时,这是否相当有效?我最关心的是移动设备——假设我将在Obj-C中使用一个通用的XMPP库,并且游戏的iPhone应用程序已打开,那么游戏打开时,你将连接到100 MUC。我想确保我采用的方法不会消耗太多电池,也不会影响设备的响应。我一直在考虑实施服务器端解决方案,自动为每场比赛创建一个共享名册组,然后将所有玩家添加到其中,并在比赛结束后将其销毁。如果我走这条路,当玩家在游戏中时,我应该继续使用MUC吗?聊天屏幕位于棋盘旁边,游戏中的所有玩家都可以看到,游戏中没有私人信息。我只是用共享名册做了很多测试,但它太脆弱了——至少对eJabberd2来说是这样。假设玩家A和B已经相互订阅。A、 B&C都会一起开始一场比赛,因此会创建一个包含所有3名球员的名册组。现在,玩家A和B都可以获得玩家C的状态通知。但是,一旦游戏结束,我删除了共享名册组,共享名册的所有成员都会收到“不可用”状态通知,即使该用户在我的全球名册上。这发生在我的应用程序和iChat中。我想我在最后的评论中说得太早了。以前,我只是试图从共享花名册组中删除我的测试用户——这会导致“不可用”状态通知。如果我真的删除了共享名册组,组中的每个人在注销之前仍然可以看到对方的存在。一旦他们再次登录,共享组将不再显示。看起来这可能是解决方案的一大部分。我很确定这就是我要走的路线。创建一个共享的花名册组,并将所有参与者放入其中,可以向每个球员通知他们的对手。我可以在比赛结束后删除该组,并且该名单将在下次球员登录时从每个球员名册中删除。我现在正在测试在服务器上创建pubsub事件,以便为每个玩家订阅每个游戏。我确实觉得我是对的。非常感谢你!您正在使用哪个XMPP服务器?目前最新的ejabberd2稳定版本。昨晚下载并安装了,但我愿意切换到任何东西。