有关无缝MMO服务器架构的信息


9

我正在寻找无缝MMO服务器上的任何材料!在“大型多人游戏开发”和“游戏编程宝石5”这两本书中,我确实有几篇文章。有没有人在该主题上有经验或知道有关该主题的文章?

我对“高级视图”以及实现感兴趣。这可能成为我的硕士论文的主题,在我实际开始撰写论文之前,我想弄清楚编写这样一个系统有多困难。现在我还没有决定使用哪种语言,我在考虑Java或Scala。Erlang可能是一个选择,但我从来没有这样做。

注意:基本要求是运动。其他任何游戏系统都是可选的,并给予“奖励积分”。

现在,我对“无缝服务器”的含义是:我想要建立一个服务器群集,其中每个节点都以静态边界控制游戏世界的某些部分。玩家现在可以从世界的另一端移动到另一端而无需切换实例或击中某些“传送者”。我认为《魔兽世界》就是这么做的。但是在我的后端,播放器从一台服务器过渡到另一台服务器。


不久前,我读到每个WoW服务器包含5个以上的刀片服务器-每个大陆和数据库都有1个刀片服务器。尽管我假设现在这些都驻留在自己的集群上以允许跨领域连接,但过去也曾经是地牢和战场。简而言之,大洲位于一台服务器上-除非您更改大洲,否则您不会过渡到另一台服务器。
宽大处理

有趣的是,您还记得在哪里读的书吗?就像我说的那样,我从不玩魔兽世界,也不知道各洲有多大,但是我无法想象每个洲都托管在一台单独的服务器上。
2011年

3
WOW服务器统计信息:总共13250个刀片服务器,75000个CPU内核,112.5 TB的RAM(从GDC Austin 09开始)。见这里 ; 不一定全都致力于《魔兽世界》,但足够接近。

@Josh Petrie:谢谢,今天早些时候找到了这篇文章。但是我仍在寻找有关无缝或连续服务器体系结构的内容。
Lurca 2011年

Answers:


5

管理这样的系统的主要复杂性在于您需要的无缝程度。正如Josh所说,解决将实体从一台服务器切换到另一台服务器的问题是该程序包的关键部分。

但是,这不是唯一的问题-如果跨多个服务器的实体需要作为一个操作的一部分进行交互,则您现在遇到一个同步问题,其中每个系统都需要来自另一端的数据才能继续进行,但是到数据到达时,它可能会已经无效。您可以尝试通过将操作分解为具有回退功能的多条消息(如果有一侧回退的话)来解决此问题,但是正如您从“大型多人游戏开发”的第3.1章所看到的,这极大地复杂了您必须进行的任何游戏逻辑做到这一点。Scala和Erlang帮助您正确设置消息传递系统-它们不能帮助您将以前是10行的函数分解为现在需要跟踪的许多不同消息和状态。

显然,这个问题并不完全是新问题,关系数据库通过集中存储所有数据并允许多个客户端根据需要查询和更改它,并在必要时回滚事务来支持这种问题。这给了您大多数的正确性要求,但不幸的是,这带来了不切实际的性能问题,并使游戏逻辑实现变得笨拙(因为现在很多逻辑都写在数据库存储过程中了)。在这里,不同类型的数据库可能会提供一个很好的解决方案,尤其是如果您愿意折衷大多数RDBMS提供的可靠性要求时。

大多数专业游戏都没有尝试解决此问题,方法是将分片大小保持足够小以将所有玩家都放在一台服务器上,将世界划分为没有真正相互作用的部分(请参阅上面的评论中的WoW示例) ,或通过基于功能而不是地理位置的服务器分配游戏(例如,所有战斗都发生在一个服务器上,所有聊天都发生在另一台服务器上),因此没有“缝隙”可争。


3

我对“高级视图”以及实现感兴趣。

通常情况下,实现会涉及到相当多的深度,在这里您可能不会多谈论它们。StackExchange软件不适合进行此类讨论,更不用说它会花费大量时间。

我想找出编写这样一个系统有多困难

几乎没有任何其他系统那么难:它将取决于您的要求和要驱动的功能。您可以平凡地编写平凡的实现,但是非平凡的东西当然会困难得多。更大的问题之一是,您可能没有足够的实际客户来判断您的系统是否真正扩展到了《魔兽世界》和其他游戏所运行的“大规模”水平

MMO不是神奇的。当孤立地考虑时,他们的大多数技术都没什么特别的,仅仅是将一些更小,更简单的技术非常智能地组合在一起,从而可以对某些共享世界状态进行大规模,连接的并行模拟。

我想建立一个服务器群集,其中每个节点都以静态边界控制游戏世界的某些部分。玩家现在可以从世界的另一端移动到另一端而无需切换实例或击中某些“传送者”。

本质上讲,您所谈论的是模拟交接。这可以非常简单地完成,并且不一定是MMO专用技术(点对点游戏倾向于支持所有相同的基础机制来实现主机迁移)。基本前提是让每台服务器了解“围绕”它的服务器的拓扑(具体来说,世界节点A的服务器必须了解与模拟世界节点相邻的服务器),并定义一个缓冲区,您可以在该缓冲区周围考虑特定的模拟实体“靠近”相邻服务器。

当实体进入“关闭”缓冲区时,您也开始将其报告给相邻的服务器。一旦实体超过实际阈值,您就会向该实体的完整状态的相邻服务器发送一条消息,并指示该相邻服务器应接管该实体的消息。显然,您希望它尽可能可靠。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.