大型多人在线角色扮演游戏是如何构建的?

时间:2009-09-13 20:24:47

标签: web-services communication real-time

如何构建大型多人在线角色扮演游戏?

  • 他们构建了哪些服务器基础架构?特别是有这么多客户实时连接和沟通。

  • 他们是否使用针对页面请求执行的脚本进行管理?或已安装的服务在后台运行并管理与已连接客户端的通信?

  • 他们使用其他协议吗?因为HTTP不允许服务器将数据推送到客户端。

  • “引擎”如何运作,集中处理数百个相互冲突的游戏事件?

感谢您的时间。

6 个答案:

答案 0 :(得分:5)

许多道路通往罗马,许多建筑都通向了MMORPG。

以下是您的要点的一般想法:

  • 服务器基础架构需要支持向外扩展的能力...随着负载的增加添加额外的服务器。顺便说一句,这非常适合云计算。我目前正在运行一个大型金融服务应用程序,需要根据一天中的时间和一年中的时间进行扩展和缩小。我们使用Amazon AWS几乎可以立即添加和删除虚拟服务器。
  • 我熟悉的MMORPG可能不使用Web服务进行通信(因为它们是无状态的),而是使用自定义服务器端程序(例如,侦听TCP和/或UDP消息的服务)。
  • 他们可能使用自定义的基于TCP和/或UDP的协议(查看套接字通信)
  • 大多数游戏被划分为“世界”,将同一虚拟世界中的玩家数量限制为一个服务器(可能具有大量CPU和大量内存)可以合理处理的游戏事件数量。确切的事件处理机制取决于游戏设计者的要求,但通常我希望传入的事件进入优先级队列(按接收时间和/或发送时间的优先顺序排列,可能还有其他标准“如果有多糟糕的话”我们忽略了这个事件?“)。

这是一个非常大的主题。我建议您在Amazon.com上查看有关此主题的书籍。

答案 1 :(得分:3)

他们构建了哪些服务器基础架构?特别是有这么多客户实时连接和沟通。

我猜服务器将在99%的时间内在Linux,BSD或Solaris上运行。

他们是否使用执行页面请求的脚本进行管理?或已安装的服务在后台运行并管理与已连接客户端的通信?

您的客户端与之通信的服务器将是运行守护程序或服务的服务器,该服务器处于空闲状态并侦听连接。对于实例(地牢),通常会为每个组启动一个新进程,这意味着有一个调度程序服务在某处管理(类似于线程池)

他们使用其他协议吗?因为HTTP不允许服务器将数据推送到客户端。

UDP是使用的协议。它很快,因为它不能保证收到数据包。如果一点延迟导致客户端失去世界地位,你就不在乎了。

“引擎”如何工作,集中处理数百个冲突的游戏事件?

大多数MMO都有区域,这限制了一定数量的人。对于那些在一个区域内拥有100人的人来说,通常存在高延迟。服务器必须处理100个以其方式发送的法术,必须计算每个法术的伤害数量。对于五大MMO,我想有10到20名非常聪明,有数学天赋的开发人员每天都在进行这项工作,并且没有一个MMO在那里做得对,大多数在100名玩家之后休息。

-

查看Wowemu(没有官方网站,我不想链接到一个狡猾的网站)。这基于ApireCore,它是一个MMO模拟器,或者基本上是WoW协议的逆向工程师。这就是私有魔兽世界服务器的用武之地。从我记得Wowemu是

  • MySQL的
  • 的Python

然而,ApireCore是C ++。

Wowemu的后端非常简单(我在2005年尝试过),可能完全过度简化了数据库模式。它确实让您了解所涉及的内容。

答案 2 :(得分:2)

由于MMO大体上需要开发和部署企业资源,此时它们是有价值的公司IP,因此没有大量关于实施的公开信息。

有一点可以肯定的是,由于MMO大体上使用自定义客户端和3D渲染器,因此它们不使用HTTP,因为它们不是Web浏览器。在线游戏将在TCP / IP或UDP之上建立自己的协议。

游戏模拟本身将使用与任何联网3D游戏相同的技术构建,因此您可以查看该问题域的资源以了解更多信息。

对于大爸爸,魔兽世界,我们可以猜测他们的数据库是Oracle,因为暴雪的工作列表经常引用Oracle的经验作为要求/加号。他们使用Lua进行用户界面脚本编写。可以假设C ++和OpenGL(适用于Mac)和Direct3D(适用于PC)作为游戏客户端的实现语言,因为这就是游戏的制作过程。

一个很酷的讨论实施的公司是CCP,Eve在线的创建者。他们发布了许多关于Eve基础设施的演示文章和文章,这是一个特别有趣的案例,因为他们使用Stackless Python来实现Eve的很多实现。

http://www.disinterest.org/resource/PyCon2006-StacklessInEve.wmv http://us.pycon.org/2009/conference/schedule/event/91/

最近有一篇关于夏娃建筑的游戏开发者杂志文章:

https://store.cmpgame.com/product/3359/Game-Developer-June%7B47%7DJuly-2009-Issue---Digital-Edition

答案 3 :(得分:1)

软件工程广播播客有一个episode with Jim Purbrick about Second Life,讨论服务器,世界,缩放和其他MMORPG内部。

答案 4 :(得分:1)

传统上,MMO基于在Linux上运行的C ++服务器应用程序,与使用OpenGL或DirectX的后端存储和胖客户端应用程序的数据库进行通信。

在许多情况下,客户端和服务器嵌入了脚本引擎,该引擎允许以更高级别的语言定义行为。 EVE值得注意的是,它主要是用Python实现的,并且运行在Stackless之上,而不是主要是带有一些高级脚本的C ++。

通常,服务器处于循环中,读取来自连接客户端的请求,处理它们以强制执行游戏机制,然后向客户端发送更新。 UDP可用于最小化延迟和过时数据的重传,但由于RPG通常不使用抽搐游戏,TCP / IP通常是更好的选择。 Comet或BOSH可以用于通过HTTP进行双向通信,用于基于Web的MMO和Web套接字很快就会成为一个很好的选择。

如果我今天正在构建一个新的MMO,我可能会使用XMPP,BOSH并在JavaScript中构建客户端,因为它可以在没有胖客户端下载的情况下工作,并与基于XMPP的IM和语音系统(如gchat)互操作。一旦WebGL得到广泛支持,这甚至可以允许基于浏览器的3D虚拟世界。

由于环境太大而无法在单个过程中进行模拟,因此它们通常在地理位置之间进行分割,每个过程模拟世界的一小块区域。通常,世界上存在最佳人口,因此运行不同人群的多个副本(分片)。

在这里担任运营总监的Ian Wilkes对第二人生建筑进行了很好的介绍:http://www.infoq.com/presentations/Second-Life-Ian-Wilkes

我关于Second Life技术的大部分讨论都与我的博客相关联:http://jimpurbrick.com

答案 5 :(得分:-1)

看看Erlang。它是一种并发编程语言和运行时系统,旨在支持分布式,容错,软实时,不间断的应用程序。