我正在尝试为实时 3D 游戏创建 C++ 插件。虽然我相信对 UDP 的理论、它是如何工作的、它的优点和缺点有什么牢牢把握,但我主要关心的是性能、可扩展性和可能的统计数据。我知道,在 UDP 甚至 TCP 方面,我可能只知道沧海一粟。
问题:
给定一个特定的场景,一个典型的专用服务器可以在任何时候处理多少玩家。
现在的场景...
假设我们有一个 MMORPG 游戏,所有玩家都可以在“游戏世界”的任何地方。每个人都向同一个服务器/服务器集线器发送和接收数据,因为每个人都必须能够......看到其他人并与之交互,当他们的路径最终交叉时。这是一个实时的第一人称游戏,所以玩家位置必须是最新的,非常及时。
假设我们有 1000 名(甚至 10000 名)在线玩家......
这里需要发生三件主要的事情:
每个玩家通过 UDP 将他们的数据流式传输到游戏服务器,例如每秒发送 14 次。简而言之,这些数据包括每个玩家是谁、在哪里以及是什么。发送的数据已针对大小和速度进行了规范化和优化,以鼓励最小的带宽使用。
例如,服务器每秒接收多达 1000 个(用于演示目的的非虚构数字)这些数据包 14 次,因此每秒处理 14 000 个数据包。此处理阶段通常涉及更新中央存储器数据结构,其中玩家的旧 x、y、z 位置数据将使用他的新位置和时间戳进行更新。服务器上的这个数据结构包含整个游戏世界中所有玩家的所有数据。
服务器(可能是一个单独的线程,甚至可能是一台单独的机器)现在需要将数据包广播给所有其他玩家,以便他们可以更新屏幕以在地图上显示其他玩家。这也每秒发生 14 次。(其中 14 通常可能是一个动态数字,根据正在使用的 CPU 容量、繁忙的 CPU、较低的帧速率而变化,反之亦然)。
重要的是:对于玩家 X,只有在其位置可视范围内的其他玩家的数据才会发送给各自的玩家。因此,如果玩家 Y 在 2 英里之外,则需要将他的数据发送给 X,但如果玩家 Z 在地球的另一端,则不会将他的数据发送给 X,以节省带宽。这当然涉及更多处理,因为必须使用最有效的索引解决方案对数据进行迭代和过滤。
现在我担心的是,从客户端机器发送数据包,将其放入服务器 RAM,进行一点点处理更新数据,并有选择地将信息广播给其他玩家,这需要时间。这意味着,服务器能够处理某个阈值,是的,取决于我的实现的有效性、所使用硬件的速度和能力,当然还有其他外部因素,例如互联网速度,交通和天然橡胶。每秒撞击地球的太阳耀斑......开玩笑的。
我试图从其他人那里找出经历过这个过程的人,其中的陷阱是什么,以及在创建多人插件时我可以期待什么样的典型性能。
我可以很容易地说:“我想同时满足 10000 人在同一服务器上玩的需求”,你可能会说:“100 是一个更现实和可能的数字,每台服务器。”
所以我知道我可能必须想出一个多服务器/云计算中心来处理我的数千个请求和调度,将处理负载分布在多台机器上。所以我可能有几台机器只处理接收数据,一个巨大的中央盒子,它就像一个内存数据库,由所有接收和调度机器以某种方式共享,当然还有一系列调度机器。
显然,存在技术限制,我真的不知道会发生什么以及它们是什么。并且在问题上投入额外的 CPU 和服务器盒不一定能解决问题,因为机器之间更多的相互通信也会稍微减慢处理速度。我想你投入的 CPU 越多,可能会降低效率,甚至在某个阈值处逆转 CPU 生产力。
我可以而且应该考虑多人游戏的 P2P(点对点)!
我是否现实地说我将能够同时满足 2500 名玩家的需求?
是否有可能在几年内扩大到 10000 名玩家?
我知道这个问题很长,所以请接受我诚挚的歉意。