多人UDP联网策略,需要建议

时间:2009-11-02 15:10:16

标签: networking udp multiplayer

我正在尝试为实时3D游戏创建一个C ++插件。虽然我相信对UDP的理论,它是如何工作的,它的优点和缺点有一个坚定的把握,但我关注的主要问题是性能,可扩展性和可能的​​统计数据。我知道,对于UDP甚至是TCP,我可能只知道海洋的价值下降。

问题:

鉴于某种情况,一个典型的专用服务器能够在任何时候处理多少玩家。

现在为场景......

让我们假设我们有一个MMORPG游戏,所有玩家都可以在“游戏世界”的任何地方。每个人都向同一个服务器/服务器中心发送和接收数据,因为每个人都必须能够......在他们的路径最终交叉时看到并与其他人互动。这是一个实时的第一人称游戏,所以玩家的位置必须是最新的,非常及时。

让我们说我们有1000名(甚至10000名)在线玩家......

这里需要做三件事:

  1. 每个玩家通过UDP将数据传输到游戏服务器,比如每秒14次发送。简而言之,这些数据包括每个玩家的身份,地点和内容。发送的数据已经过标准化,并针对大小和速度进行了优化,以鼓励最小的带宽使用。

  2. 服务器每秒14次接收这些数据包最多1000个(用于演示目的的非虚构数字),因此每秒处理14 000个数据包。该处理阶段通常涉及更新中央存储器数据结构,其中玩家旧的x,y,z位置数据将用他的新位置和时间戳更新。服务器上的此数据结构包含整个游戏世界中所有玩家的所有数据。

  3. 服务器(可能是一个单独的线程,甚至可能是一台单独的机器)现在需要将数据包广播给所有其他玩家,因此他们可以更新他们的屏幕以显示地图上的其他玩家。这也是每秒发生14次。 (其中14可能通常是一个动态数字,根据使用的CPU容量,繁忙的CPU,较少的帧速率而反之亦然)。

  4. 重要的是:对于玩家X,只有他位置视觉范围内的其他玩家的数据被发送到相应的玩家。因此,如果玩家Y在2英里外,他的数据需要发送到X,但如果玩家Z在行星的另一边,他的数据不会被分派到X作为节省带宽的尝试。这当然涉及更多的处理,因为必须使用最有效的索引解决方案来迭代和过滤数据。

    现在我担心的是,从客户端机器发送数据包,将其送入服务器RAM,稍微处理更新数据,并选择性地将信息广播给其他玩家,需要时间。这意味着,服务器能够处理某个阈值,是的,取决于我的实现的有效性,所用硬件的速度和能力,当然还有其他外部因素,如互联网速度,交通和nr。太阳耀斑每秒击中地球......开个玩笑。

    我试图从其他人那里了解,他们已经完成了这个过程,陷阱是什么,以及在创建多人插件时我可以期待的典型表现。

    我可以很容易地说:“我想要同时为同一台服务器上的10000个人提供服务”,你可能会说:“每个服务器100个是更现实和可能的数字。”

    所以我知道我可能需要提出一个多服务器/云计算中心来处理我的数千个请求和调度,在多台机器上分配处理负载。所以我可能有一些机器只处理接收数据,一个巨大的中央盒子,就像所有接收和调度机器以某种方式共享的内存数据库,当然还有一系列调度机器。

    显然,存在技术限制,我真的不知道会发生什么以及它们是什么。并且在问题上抛出额外的CPU和服务器盒将不会成功地解决问题,因为机器之间的更多相互通信也将使该过程减慢一些。我认为你投入的CPU越多,可能会降低效率,甚至可以在某个门槛上逆转CPU工作效率。

    可以而且我应该考虑P2P(Peer To Peer)进行多人游戏!

    我是否现实地说我一次可以满足2500名玩家的需要?

    几年后可以扩展到10000名玩家吗?

    我知道这个问题太长了,所以请接受我真诚的道歉。

5 个答案:

答案 0 :(得分:2)

缩放问题完全合法。然而,对UDP的关注是错误的。它不会成为你的主要问题。

原因是玩家 - 玩家之间的互动基本上是一个O(N * N)问题。另一方面,服务器带宽是O(N)问题。考虑到现代网络服务器可以使用TCP over TCP来缓冲1Gbit以太网,UDP的较低开销意味着只要您的计算成功,您就可能能够使用UDP饱和1 Gbit以太网。

答案 1 :(得分:1)

  • 可以而且我应该考虑P2P(Peer To Peer)进行多人游戏吗?我不认为p2p技术能够处理游戏网络的实时方面。此外,在通常的p2p网络中,您不会同时连接到数千个成员,但是您通常连接到某些上游节点,因此它更像是一个图形而不是非常扁平的树。

  • 我是否真实地说我一次可以满足2500名玩家的需要?不在一台服务器上。但是,通过将用户分布到多个服务器上,如果它是一个非常大的世界,您已经可以按照游戏世界中的地理区域(例如按大陆或国家/地区)过滤它们。对于低延迟,您无论如何都希望将服务器保持在用户的真实位置附近 - 如果您居住在美国,则不会在欧洲服务器上播放,反之亦然。

  • 几年内可以扩展到10000名玩家吗?有很多方法可以优化数据的编码和传输方式。仅发送游戏世界状态的增量,玩家移动的客户端预测,网络级别的广播,服务器端的云计算等,并且在未来几年将会有更多,特别是。当游戏行业接触到像OnLive这样的基于云的计算平台时,我们需要更高效的算法和基础设施才能应对这些数量。

答案 2 :(得分:1)

P2P的问题最终是最终用户的联系。在很多情况下,ISP通常不会给你很多上传。下载速度的1/10。很多用户都支持NAT,因此您需要为客户端设置某种形式的代理来启动连接。您将需要处理用户断开连接和数据包丢失(对于蹩脚无线的不可避免的节点,丢失一半的数据包)。而且您需要一种通过ISP /位置对客户进行分组的好方法,这样它们之间就不会有200ms + ping。

IMO听起来像是一场等待发生的灾难。你可能最好使用一个众所周知的网络库(和传统的客户端/服务器架构),然后尝试发明一个方形轮。只传输需要更新的内容(注意大多数MMO包含大型动态对象的大型静态世界)。

答案 3 :(得分:1)

缩放问题是MMO最难的挑战之一,也是部分解决的问题。有许多如何跟踪和更新用户信息的示例。

我要提到的一点是,从历史上看,游戏是一种社交活动,因此大多数人都倾向于在一个中心区域或单一区域聚集在一起。所以你真的必须为这个最坏的情况设计。

有些游戏真的需要一种巨大的史诗般的感觉,让所有用户分组和聚集在一起是一个核心设计要求。对于这种类型的游戏,请计划所有用户位于完全相同的位置。对于其他游戏,你应该能够将它们分成小组并分而治之。

答案 4 :(得分:1)

能否而且我应该考虑用于多人游戏的P2P(点对点) - 不,这可以让你充分利用作弊和各种可靠性问题。这是最好的未开封的蠕虫。如果你担心这个问题,它可能会帮助你解决内容分发问题。

我是否现实地说我一次可以满足2500名玩家的需要? - 当然,重点在于你如何实现它。在90年代中期,像Desmsir Realm或Medievia这样的文字游戏同时在线处理数百名玩家。他们没有每秒向每个人发送数据14次,但他们确实每秒更新这些玩家几次。从那以后,计算能力增加了约250倍。值得深思。

几年后可以扩展到10000名玩家吗? - 现在可以这样做,如果你放宽了带宽需求,那么你并不总是发送14次更新一秒钟,或放宽每个人由1台服务器处理的要求。 “ C10K问题”已得到解决over 10 years ago。显然,FTP客户端不是实时游戏,但另一方面,它的吞吐量要求更高。如果你可以容忍一点额外的延迟以换取更高的带宽,那么你就是一个胜利者。