Actionscript 3 仅使用RTMFP进行随机匹配(Adobe Cirrus)

Actionscript 3 仅使用RTMFP进行随机匹配(Adobe Cirrus),actionscript-3,flash,apache-flex,flash-media-server,rtmfp,Actionscript 3,Flash,Apache Flex,Flash Media Server,Rtmfp,我正试图想出在一个简单的游戏中进行随机配对的最佳方法 在使用AdobeCirus进行netStreams实验时,我可以轻松地建立直接连接,发送数据、文本、视频和声音,所有这些都可以使用Cirrus,这非常好。我发现建立一个简单的P2P连接非常容易,而且它的工作原理和我所需要的一样 但我真的想实现一个随机配对功能,只使用卷云,所以一切都是通过p2p 我该如何在同一组中随机抓取一个与其他人没有直接联系的同伴 一些想法: -我在想也许我可以使用对象复制…当有人连接到GroupSpecifier时,我可

我正试图想出在一个简单的游戏中进行随机配对的最佳方法

在使用AdobeCirus进行netStreams实验时,我可以轻松地建立直接连接,发送数据、文本、视频和声音,所有这些都可以使用Cirrus,这非常好。我发现建立一个简单的P2P连接非常容易,而且它的工作原理和我所需要的一样

但我真的想实现一个随机配对功能,只使用卷云,所以一切都是通过p2p

我该如何在同一组中随机抓取一个与其他人没有直接联系的同伴

一些想法:

-我在想也许我可以使用对象复制…当有人连接到GroupSpecifier时,我可以将另一个对象推送到这个共享阵列中,该阵列具有本地peerID及其状态。当他们在游戏中时,我可以改变阵型。但是我担心如果这个人只是关闭了网络窗口,他们的条目就不能保证被删除

-我还考虑过只向包含nearID的组发送一条“帖子”,其他同龄人可以获得帖子……而那些不在游戏中的人会尝试直接连接回来。然后,那一方将连接到它们。那么他们两个都会有直接的联系。但是我觉得如果可能有100多人“可用”…得到帖子…然后他们都尝试联系一个人,那么这可能会导致问题


-另外,我也想过做Sendtonest…但这不是最好的匹配方式…因为我认为你只能有这么多邻居。。。如果团队中有1000人。你只能和几个被认为是你邻居的同龄人联系,对吗?然后,基本上你可以只与相同的5-10个人进行匹配,或者从技术上说,他们被视为邻居。

我认为在匹配节点时没有任何方法可以避免超时和重试,因为1)存在未知和可变的网络延迟,2)连接可能在未知时间加入和离开

因此,任何试图连接到另一个节点的节点都必须保留以下有状态参数:

  • 我与另一个节点匹配
  • 我有一个未完成的匹配请求
    • 我的未完成匹配请求是到节点X
如果前两个中的任何一个为true,它必须拒绝传入的匹配请求(除非传入的请求来自节点X,并且我对同一节点有一个未完成的请求)。只有当两者都为false时,它才能请求匹配

此外,一旦匹配,他们可能需要轮询他们的合作伙伴或观察断开连接的消息并做出适当的响应(返回匹配阶段,或退出,无论应用程序需要什么)

在这种情况下,您至少可以通过创建排序算法来减少同步节点所需的网络通信量,以便所有节点提前知道其最佳匹配者,并尝试以最少的网络通信量(无广播post消息,无随机尝试)直接连接到其最佳匹配者

关键是peerID,网络组中的每个节点都自动获取它。当节点接收到NeighborConnect消息时,它还包含邻居节点的唯一peerrid。换句话说,每个节点都有一个唯一的名称(基本上是一个大的随机数),并且知道所有其他节点的唯一名称

这个皮纹很长,大约256位。您可以使用它创建一个排序顺序——可能类似于:将前32位视为int,将远程节点peerID与您自己的peerID进行异或,并将远程节点从最低到最高排序

因此,现在每个节点对要连接的对象都有大致相同的想法(尽管会有差异,例如,基于在组中传播的dis/connection消息)。节点将遍历排序后的列表,试图连接到它们的最佳匹配项,可能在失败的连接尝试之间有一些随机超时


这可能不是理想的解决方案-可能存在更好的解决方案,但我认为这比随机尝试节点或使用广播消息要好。

好主意!我喜欢前两个的一些组合,带有一个令牌(或n个令牌,基于#个对等点)。为每个不匹配的对等方分配一段短时间的令牌。这是他们连接的机会,因此没有大量用户,如果他们不报告结果,他们将被删除。就像一个老式的令牌环网络:)