【问题标题】:How are Massively Multiplayer Online RPGs built?大型多人在线角色扮演游戏是如何构建的?
【发布时间】:2009-09-13 20:24:46
【问题描述】:

大型多人在线 RPG 游戏是如何构建的?

  • 它们建立在什么服务器基础架构之上?尤其是在有这么多客户实时连接和通信的情况下。

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

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

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

感谢您的宝贵时间。

【问题讨论】:

  • en.wikipedia.org/wiki/Comet_%28programming%29... "Comet 是一个新词,用于描述一种 Web 应用程序模型,其中长期持有的 HTTP 请求允许 Web 服务器将数据推送到浏览器"
  • @Mehrdad:所以是 RPG?见鬼,这就解释了所有的怪人。
  • 我只想把它扔出去:过早选择答案会阻碍更好的答案。
  • “在页面请求上执行的脚本”、“在 [服务器] 后台运行的已安装服务” - 这里似乎隐藏了许多假设。 MMORPG 不是网络应用程序。

标签: web-services communication real-time


【解决方案1】:

多条道路通向罗马,多条建筑通向 MMORPG。

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

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

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

【讨论】:

  • EVE Online 是“分段世界”方法的一个例外,例如魔兽世界。你可以阅读他们使用的设置:highscalability.com/eve-online-architecture
  • @Ian:读起来很有趣。看起来他们基本上按照每个太阳系中正在发生的事情来分割他们的世界,并将事件从面向客户端的层路由到负责游戏世界特定地理区域的服务器。
【解决方案2】:

他们建立在什么服务器基础设施之上?尤其是在有这么多客户实时连接和通信的情况下。

我猜这些服务器几乎 99% 的时间都在 Linux、BSD 或 Solaris 上运行。

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

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

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

UDP 是使用的协议。它很快,因为它不保证会收到数据包。你不在乎一点延迟是否会导致客户端失去他们的世界位置。

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

大多数 MMO 都设有限制特定人数的区域。对于那些在一个区域有 100 人的企业来说,通常会有很高的延迟。服务器必须处理 100 多个发送的法术,它必须计算每个法术的伤害量。对于 5 大 MMO,我认为每天都有 10 到 20 名非常聪明、具有数学天赋的开发人员组成的团队致力于这项工作,但目前还没有一款 MMO 能够做到这一点,大多数在 100 名玩家之后就崩溃了。

--

看看Wowemu(没有官方网站,我不想链接到一个狡猾的网站)。这是基于ApireCore,这是一个 MMO 模拟器,或者基本上是 WoW 协议的逆向工程师。这就是私人魔兽服务器运行的原因。据我记得Wowemu是

  • mySQL
  • Python

但是 ApireCore 是 C++。

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

【讨论】:

    【解决方案3】:

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

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

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

    对于魔兽世界的老大哥,我们可以猜测他们的数据库是甲骨文,因为暴雪的职位列表经常将甲骨文经验列为要求/加分项。他们使用 Lua 编写用户界面脚本。 C++ 和 OpenGL(适用于 Mac)和 Direct3D(适用于 PC)可以假定为游戏客户端的实现语言,因为这是制作游戏的语言。

    CCP 是 Eve Online 的创建者,他们很乐意讨论其实施。他们发表了许多关于 Eve 基础架构的演示文稿和文章,这是一个特别有趣的案例,因为他们在 Eve 的很多实现中使用 Stackless Python。

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

    最近还有一篇关于 Eve 架构的 Game Developer Magazine 文章:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

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

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

        这里的运营总监 Ian Wilkes 对第二人生架构做了一个很好的介绍:http://www.infoq.com/presentations/Second-Life-Ian-Wilkes

        我关于第二人生技术的大部分演讲都链接到我的博客:http://jimpurbrick.com

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • Erlang 看起来确实不错,但我不认为它在实践中用于制作 MMORPG。
          • 不是,所以它与MMO的构建方式无关。
          • 在实践中没有使用它的原因是因为它是一种函数式语言,大多数程序员除了 OO 什么都不懂。我还记得读过有关用 Erlang 编写的 MMO 服务器的文章。相信我,Erlang 比其他任何语言都更适合构建服务器。
          • 我明白你在说什么,但问题不在于在你制作 MMORPG 的假设世界中你将使用什么来完成任务;它是关于实际用于制作 MMORPG 的技术。
          猜你喜欢
          • 2013-02-02
          • 1970-01-01
          • 2021-05-17
          • 2011-01-08
          • 2020-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-12
          相关资源
          最近更新 更多