【问题标题】:Inner workings of browser based real-time MMO games基于浏览器的实时 MMO 游戏的内部运作
【发布时间】:2017-11-12 14:11:54
【问题描述】:

所以,假设有一个游戏,它由一个网站和一个可以从该网站启动的客户端组成。我看了一点,一个相关的例子是 Habbo Hotel。

我要问的是,有哪些不同的部分可以让这样的游戏正常运行:对于网站部分,我认为需要一个服务器、一个数据库,以及一些 HTML、CSS 和 PhP 编码,但是客户端如何操作?

更具体地说,客户端到服务器(反之亦然)的实时通信将如何发生? 假设客户端是用 C 编写的,如何将 C 集成到(我想是 PhP 框架的)浏览器窗口中执行? 请注意,客户端永远不会下载到用户的 PC 上,那么它会驻留在哪里?

很抱歉,如果这些问题很多,如果答案太繁琐而无法撰写,请随时留下一些文档或教程(我一直在寻找但还没有真正能够找到),我会很高兴自己阅读它们。提前致谢。

【问题讨论】:

  • 如果游戏在浏览器中运行客户端,你可以 99% 确定它是一个 javascript 应用程序,它将使用 XHR 或开放的 websocket(或两者的组合)与服务器端后端通信)。客户端下载到用户PC,否则用户PC无法显示。
  • @rickdenhaan 非常有趣,谢谢。那么我想下载是在没有安装的情况下发生的?
  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。避免一次问多个不同的问题。有关澄清此问题的帮助,请参阅如何提问页面。我认为这个问题太宽泛了,因为 OP 实际上是在询问如何制作基于 MMO 浏览器的游戏。
  • @Michele 当然,就像任何其他基于 javascript 的网络应用程序或游戏一样。例如,您没有看到 gmail 或 slimher.io 的安装程序,对吗?浏览器将所有资源下载到一个临时文件夹并从那里运行它。如果您打开浏览器开发者工具的网络检查器,就​​会看到这种情况。
  • @Badda 感谢您的反馈。我认为我应该更喜欢制作多个线程,每个线程都专注于一个特定的问题,而不是一个有多个问题的线程。你是对的,我有点问这个问题,但同时我确信有一些文档可以解释这个过程,所以我对这个文档的链接感到满意。也就是说,如果更多用户将我的问题标记为过于宽泛,我将对其进行编辑并缩小范围。

标签: javascript php database server real-time


【解决方案1】:

一方面你的问题太宽泛,但另一方面我可以给你一些关于如何以现代方式做到这一点的建议:

  • 没有客户端,只有浏览器中的一个页面
  • 使用 HTML5 画布,您可能还想研究 SPA(单页应用程序)
  • 通过 websocket 连接,服务器端有 HTML5 javascript 实现和 PHP 或 node.js
  • 最好是在服务器上使用node.js,PHP太麻烦了
  • 通过 websocket,发送和接收 JSON 对象
  • 在其本机平台 (Linux) 上托管 node.js
  • 您可能希望将 Phaser 视为 HTML5 客户端画布渲染框架,但它缺乏许多功能,主要面向基于 twitch 的动作游戏,由于滞后,该架构不能很好地工作李>

这将导致您得出一个结论:javascript 是该系统的中心。你会遇到几个障碍,例如:

  • 使用 SSL 登录的 websocket 安全性
  • 避免使用 SSL 处理实时数据(1 Hz 以上)
  • 画布内客户端上的 UI 不容易实现,您必须重新发明轮子或为此找到一个 UI 库
  • 预计会有延迟,相对于使用 TCP/IP 或 UDP (Lidgren?) 和 protobuf (Lidgren+protobuf) 是高频 AAA 标题的原生 C/C# 代码,网络代码将占用大约 20%-30% 的开销使用(MMORPG 或 FPS 等)

从您提出的问题中,我感觉到对该领域缺乏了解和知识。我想你必须提前学习大约 6-12 个月。这是我推荐的,因为如果你马上开始,你会犯很多错误并浪费你的时间。如果以上是您不知道的任何名称,请搜索并仔细研究它们。并且不要开始编写代码,您的学习曲线非常陡峭!


编辑:更多关于服务器端

如果您想实现基于动作的互动游戏(例如 FPS 或 2D 射击游戏),我必须告诉您这一点。

您可能想研究 Unity 3D,直接使用 TCP/IP 连接和二进制消息(没有 HTTP,没有 websocket,而是 protobuf)。

C#(客户端)和 node.js(服务器端)是一个很好的组合。对于水平扩展,您可能需要研究云计算、docker、配置和大量服务器安全性。

但这是充满敌意的领域,它会将您带入 DevOps 领域,这与游戏开发相去甚远。更像是建筑师的工作。想象一下,三层系统(客户端+服务器+数据库)在服务器上有一个瓶颈。

您希望生成更多节点来处理更多客户端。这就是每个基于大厅的游戏(英雄联盟、守望先锋、WoT、WoW 实例等)所做的事情以及您为分区地图所做的事情(例如 LOTRO、RIFT 中的“地图”,以及更多 MMORPGS)。此外,镜像(这意味着同一地图的多个实例以适应人口过多的人群)。

要进行这种水平扩展,您的服务器必须自行联机/脱机,而无需您点击命令和控制(例如 puppet 和类似软件)。

虽然这是终极方法,但它也有最陡峭的学习曲线,尤其是因为安全(广告 DDOS、洪水、slow-loris、假客户端等等)。在连接到集群并上线之前,必须动态“配置”一个新节点(例如 cloud-config),因此这是一个充满痛苦和学习的全新世界。

这种基于云的弹性服务器系统的核心是 SSO(单点登录)。

【讨论】:

  • 非常感谢您的回答。是的,我非常缺乏知识,我完全同意你在尝试编码之前学习的建议。尽管如此,我认为我对您使用的术语有一个很好的理解,除了谷歌会帮助我的一些术语。再次感谢。
  • 我添加了一些关于服务器端编码的更多信息,并更好地了解它需要为 3A 标题做什么。
猜你喜欢
  • 1970-01-01
  • 2012-05-02
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多