5

我正在尝试为实时 3D 游戏创建 C++ 插件。虽然我相信对 UDP 的理论、它是如何工作的、它的优点和缺点有什么牢牢把握,但我主要关心的是性能、可扩展性和可能的​​统计数据。我知道,在 UDP 甚至 TCP 方面,我可能只知道沧海一粟。

问题:

给定一个特定的场景,一个典型的专用服务器可以在任何时候处理多少玩家。

现在的场景...

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

假设我们有 1000 名(甚至 10000 名)在线玩家......

这里需要发生三件主要的事情:

  1. 每个玩家通过 UDP 将他们的数据流式传输到游戏服务器,例如每秒发送 14 次。简而言之,这些数据包括每个玩家是谁、在哪里以及是什么。发送的数据已针对大小和速度进行了规范化和优化,以鼓励最小的带宽使用。

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

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

重要的是:对于玩家 X,只有在其位置可视范围内的其他玩家的数据才会发送给各自的玩家。因此,如果玩家 Y 在 2 英里之外,则需要将他的数据发送给 X,但如果玩家 Z 在地球的另一端,则不会将他的数据发送给 X,以节省带宽。这当然涉及更多处理,因为必须使用最有效的索引解决方案对数据进行迭代和过滤。

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

我试图从其他人那里找出经历过这个过程的人,其中的陷阱是什么,以及在创建多人插件时我可以期待什么样的典型性能。

我可以很容易地说:“我想同时满足 10000 人在同一服务器上玩的需求”,你可能会说:“100 是一个更现实和可能的数字,每台服务器。”

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

显然,存在技术限制,我真的不知道会发生什么以及它们是什么。并且在问题上投入额外的 CPU 和服务器盒不一定能解决问题,因为机器之间更多的相互通信也会稍微减慢处理速度。我想你投入的 CPU 越多,可能会降低效率,甚至在某个阈值处逆转 CPU 生产力。

我可以而且应该考虑多人游戏的 P2P(点对点)!

我是否现实地说我将能够同时满足 2500 名玩家的需求?

是否有可能在几年内扩大到 10000 名玩家?

我知道这个问题很长,所以请接受我诚挚的歉意。

4

5 回答 5

2

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

原因是玩家与玩家之间的交互本质上是一个 O(N*N) 问题。另一方面,服务器带宽是一个 O(N) 问题。考虑到现代网络服务器可以通过 TCP 上的 HTTP 使 1Gbit 以太网饱和,UDP 的较低开销意味着只要您的计算保持不变,您就可能能够用 UDP 使 1Gbit 以太网饱和。

于 2009-11-02T15:29:24.963 回答
1

我可以而且应该考虑多人游戏的 P2P(点对点) - 不,这会让你面临作弊和各种可靠性问题。这是一罐蠕虫,最好不要打开。但是,如果您担心的话,它可能会帮助您进行内容分发。

我是否现实地说我将能够同时满足 2500 名玩家的需求?- 当然,但重点在于你如何实现它。在 90 年代中期,诸如 Realms of Despair 或 Medievia 等文字游戏同时在线处理数百名玩家。他们没有每秒向每个人发送 14 次数据,但他们确实每秒更新这些玩家几次。从那时起,计算能力增加了大约 250 倍。深思熟虑。

是否有可能在几年内扩大到 10000 名玩家?- 现在可以做到这一点,如果你放宽带宽要求,这样你就不会总是每秒发送 14 个更新,或者放宽每个人都由 1 个服务器处理的要求。“ C10K 问题在 10 多年前就已解决。显然 FTP 客户端不是实时游戏,但另一方面它的吞吐量要求更高。如果您可以容忍一点额外的延迟以换取更高的带宽,那么您就是赢家。

于 2009-11-17T10:32:03.233 回答
1

缩放问题是 MMO 最困难的挑战之一,并且已经部分解决。有很多关于如何跟踪和更新用户信息的示例。

不过我要提到的一点是,从历史上看,游戏是一种社交事物,因此存在一种模式,即大多数人倾向于聚集在一个中心或单个区域。所以你真的必须为这种最坏的情况进行设计。

有些游戏真的是为了一种宏大的史诗感,让所有用户被允许分组和聚集在一起是核心设计要求。对于这种类型的游戏,请计划所有用户都在同一地点。对于其他游戏,您应该能够将它们分成更小的组并分而治之。

于 2009-11-02T15:43:31.267 回答
1
  • 我可以而且应该考虑将 P2P(点对点)用于多人游戏吗?我不认为 p2p 技术能够处理游戏网络的实时方面。此外,在通常的 p2p 网络中,您不会同时连接到数千个成员,但您通常会连接到一些上游节点,因此它更像是一个图而不是一个非常扁平的树。

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

  • 是否有可能在几年内扩大到 10000 名玩家?有许多方法可以优化数据的编码和传输方式。仅发送游戏世界状态的增量、玩家运动的客户端预测、网络级别的广播、服务器端的云计算等,未来几年还会有更多,尤其是。当游戏行业接触到 OnLive 等基于云的计算平台时,很明显我们需要更高效的算法和基础架构来应对这一数量。

于 2009-11-02T15:29:36.210 回答
1

P2P 的问题归根结底是最终用户的连接。ISP 通常不会为您提供大量上传,在很多情况下小于您下载速度的 1/10。很多用户都在 NAT 之后,因此您需要为客户端设置某种形式的代理来启动连接。您将需要处理用户断开连接和数据包丢失(对于在糟糕的无线上丢弃一半数据包的不可避免的节点)。而且您将需要一种按 ISP/位置对客户端进行分组的好方法,这样它们之间就不会出现 200 毫秒以上的 ping。

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

于 2009-11-02T15:32:15.010 回答