bry*_*bam 8 apache-flex flash flash-media-server actionscript-3 rtmfp
我想在一个简单的游戏中想出最好的方法来做一些随机比赛.
在使用Adobe Cirrus试验netStream时,我可以使用Cirrus轻松设置直接连接,发送数据,文本,视频和声音.我发现很容易得到一个简单的P2P连接,它就像我需要它一样工作.
但我真的想用ONLY卷云来实现随机配对功能,所以一切都是p2p ......
我怎样才能抓住同一组中的随机同伴...那与其他人没有直接联系?
一些想法:
- 我想也许我可以使用对象复制...当有人连接到GroupSpecifier时,我可以将另一个对象推入这个具有本地peerID及其状态的共享数组中.然后我可以在游戏中改变阵列.但后来我担心,如果这个人只是关闭网页窗口,就不能保证他们的输入会被删除.
- 我还想到只对包含nearID的组进行"发布",其他同伴可以获得帖子......那些不在游戏中的人会尝试直接连接回来.然后那边将连接到他们.那么他们都会彼此直接联系.但后来我觉得如果有可能100多人"可用"...得到帖子......然后他们都试图连接到一个人,那么它可能会导致问题.
- 而且,我想过刚做sendToNearest ......但是这不是最适合人们的方式......因为你认为只有这么多邻居......如果团里有1000人.你只能连接到实际上认为你的邻居的几个同行吗?那么基本上你最终只能与同样的5-10人匹配,或者在技术上被认为是邻居.
我认为在匹配节点时没有任何方法可以避免超时和重试,因为 1)存在未知且可变的网络延迟,2)连接可能在未知时间加入和离开。
因此,任何尝试连接到另一个节点的节点都必须保留以下状态参数:
如果前两个条件之一为真,则它必须拒绝传入的匹配请求(除非传入请求来自节点 X,并且我对同一节点有一个未完成的请求)。如果两者都为假,它可能仅请求匹配。
此外,一旦匹配,他们可能需要轮询其合作伙伴或观察断开消息并适当响应(返回匹配阶段或退出,无论应用程序需要什么)。
在这种情况下,您至少可以通过创建排序算法来减少同步节点所需的网络流量,以便所有节点提前知道他们的最佳匹配是谁,并尝试使用最小的网络流量(没有广播发布消息,不是随机尝试)。
其中的关键是peerID,NetGroup 中的每个节点都会自动获取它。当节点收到NeighborConnect消息时,它还包含邻居节点的唯一peerID。换句话说,每个节点都有一个唯一的名称(基本上是一个大的随机数)并且知道所有其他节点的唯一名称。
这个peerID很长,大约256位。您可以用它创建一个排序顺序 - 也许类似于:将前 32 位视为 int,将远程节点对等点 ID 与您自己的对等点 ID 进行异或,然后从最低到最高对远程节点进行排序。
因此,现在每个节点对于要连接的对象都有大致相同的想法(尽管会有差异,例如,基于通过组传播的断开/连接消息)。节点将遍历排序列表,尝试连接到其最佳匹配,可能在失败的连接尝试之间存在一些随机超时。
这可能不是理想的解决方案 - 可能存在更好的解决方案,但我认为它比随机尝试节点或使用广播消息更好。
| 归档时间: |
|
| 查看次数: |
685 次 |
| 最近记录: |