多人游戏后端参考体系结构

这些参考体系结构描述了各种具有不同替代方法的多人游戏后端用例和实现,让您能够构建适用于您的游戏的云解决方案。

用例

在为游戏设计多人游戏后端时,有许多变量可供考虑。 下面是一些示例:

  1. 管理级别 - 从将所有精力放在自己身上,到让平台处理一切事宜
  2. 操作系统 - Windows 或 Linux
  3. 游戏会话的运行位置 - 专用服务器或对等 (P2P)
  4. 硬件 - 游戏会话的运行条件
  5. 处理时间 -实时或非实时时间 (NRT)
  6. 延迟 - 若出现滞后,玩家将处于不利情况
  7. 持久性 - 游戏世界继续存在并在内部发展,即使没有玩家与之交互,或者每个会话都有自己的开始和结束
  8. 并发玩家数量 - 小、中、大规模
  9. 允许重新连接 - 如果一个或多个玩家断开连接,他们是可以返回游戏,还是必须重新开始新的游戏会话

以下是一些多人游戏后端用例,供您浏览:

提示

如果您要寻找即时可用且可扩展的多人游戏服务器解决方案,可以考虑 PlayFab,这是一个具有多人游戏服务器支持的完整后端平台,可用于构建、发布和发展云连接游戏。

多人游戏设计

管理级别

计算服务因它们所提供的管理级别而异,包括从完全由您管理到完全由平台管理:

  • 原始虚拟机 - 一切均由您管理,它需要一个自定义扩展解决方案
  • Azure 容器实例 (ACI) - 一切均由您管理,但在容器中,它需要一个自定义扩展解决方案
  • 虚拟机规模集 / 批处理 - 根据您定义的规则,代表您管理虚拟机的扩展
  • Service Fabric / Azure Kubernetes Service (AKS) - 代表您管理容器的编排
  • PlayFab 多人游戏服务器 - 代表您对在 Azure 上运行的游戏服务器进行更高级别的编排。 有关详细信息,请参阅 PlayFab 多人游戏服务器

操作系统

下表概述了不同 Azure 计算服务支持的操作系统。

服务 仅适用于 Windows 仅适用于 Linux
原始虚拟机
Azure 容器实例 (ACI) 是*(仅限 Windows 10 1607)
虚拟机规模集
批处理
Service Fabric
Azure Kubernetes 服务 (AKS) 仅通过 AKS-Engine
函数 是(专用模式)

\ * 注意:多容器组目前仅限于 Linux 容器。

游戏会话在哪里运行?

专用服务器

玩家将其客户端设备连接到服务器,以便玩游戏。

在考虑使用专用服务器时,请注意以下几点:

  • 它们可以提供连接性和可靠性优势。
  • 它们非常易于进行有效实现和扩展。
  • 玩家作弊更加困难。
  • 其他玩家的 Internet 可能会影响游戏的帧同步情况。
  • 根据游戏类型的不同,居住在专用服务器附近的玩家相比居住得较远的玩家可能会具有明显优势。

对等 (P2P)

在考虑 P2P 模型时,请注意以下几点:

  • 运营成本比利用专用服务器低。
  • 相比专用服务器解决方案,更难完成真正成功的实现。
  • 在很多地方,家庭 Internet 服务的上传速度不够快,只能应对少数玩家。
  • 一个玩家在游戏中出现网络连接不佳可能会影响其他玩家的游戏体验。
  • 客户端有时会由于 NAT 穿透问题而无法连接。 可能需要进行端口转发。
  • 避免将每个玩家的 IP 地址直接交给其他玩家,否则玩家容易受到游戏中其他玩家的 DDoS 攻击。
  • 如果没有一个中性服务器形式的中央机构,就无法轻松防止作弊。

大厅

大厅系统相当常见,这是玩家在实际开始游戏会话之前聚集的地方,因为他们需要从相同的初始状态开始。 从技术上讲,实现后期加入支持是可行的,但由于这会显著增加复杂性,因此很少见。 大厅系统需要一个服务器,通常按如下方式工作:

  1. 玩家启动大厅,并选择性地设置游戏参数。
  2. 其他玩家可以通过游戏提供的任何查询机制查看/搜索大厅。
  3. 其中一个玩家加入大厅。
  4. 当有足够的玩家(基于游戏和大厅(如果有)创建者制定的规则)时,大厅会安全地分发每个在大厅等待的玩家的详细信息,此时它的工作便已完成。
  5. 然后,玩家开始以分散的方式发送数据包。

监视和警报

除了您首选的遥测解决方案,您还可以利用 Azure Monitor 公开您在后端解决方案中使用的 Azure 服务中的指标,以及诊断和活动日志。 Azure Monitor 还可帮助您确定影响游戏的问题。 考虑针对以下方面启用警报

  • CPU 使用情况 – 您需要在主机的 CPU 即将达到饱和状态的情况下收到通知。
  • 磁盘 I/O - 设置在以下情况下发出的警报:游戏从磁盘读取或向磁盘写入的频率超出预期。
  • 内存利用率 - 当内存分页过多时,您应该收到警报。
  • 网络流量 - 当网络流量接近饱和或突然骤降时,您应考虑生成警报。

您可以使用 Azure 资源管理器自动配置 Azure Monitor。 有关 Azure Monitor 的详细信息,请参阅使用 Azure Monitor 进行完整堆栈端对端监视

硬件

充分了解运行游戏会话所需的处理能力、存储、内存和网络流量,因为它与多人游戏后端所需的虚拟机类型直接相关。

有一些数据点与决策过程相关,并且超出了运行游戏会话所需的 CPU:

  • 游戏需要多少线程?
  • 游戏会话需要多少 RAM?
  • 用户玩游戏需要多大带宽?
  • 一个游戏会话将包含多少位用户?
  • 游戏是否需要超线程? 如果您的游戏服务器依赖于超线程,则需要使用超线程内核。
  • 什么是内存与核心比率?

通过收集此信息,您可以确定:

  • 一次会话需要多少个内核?

    如果游戏服务器在一个线程中运行,则只需一个内核。 如果游戏服务器在 1.5 个线程中运行,则需要两个内核。

    如果您想要在一个服务器中托管 5 个游戏会话,并且每个游戏会话需要一个线程,则需要至少 5 个内核。 如果您想要在一个服务器中托管 5 个游戏会话,并且每个游戏会话需要 1.5 个线程,则需要至少 8 个内核。

    考虑操作系统消耗量。 经验法则是,为虚拟机超额配置 1 或 2 个内核。

  • 将产生多少出站流量?

    这是一个重要数据,因为它具有经济影响。 此外,如果一台虚拟机中的玩家过多,您可能会面临网络限制,尤其是当您尝试在一个 NIC 中纳入数千个用户时,可能会出现瓶颈现象。

综合考虑这些因素,您可以确定将需要的虚拟机以及需为其所支付的金额。 不同的虚拟机类型具有不同的带宽吞吐量。 您需要确保网络接口能够处理需求。 将每台虚拟机的玩家数量乘以每个玩家消耗的带宽。 计算出的值不能大于针对每个虚拟机大小记录的最大 NIC/预期网络带宽 (Mbps)

值得一提的是,您可能想要利用高级存储来提高单实例虚拟机的可用性。 使用高级存储,虚拟机的 SLA 为 99.9%。

延迟的影响

在某些游戏中,需要瞬间反射,而且当您将玩家的反应时间和延迟相加时,游戏体验可能会受到负面影响。

要减少或缩短延迟,需要考虑几个问题。 从实现角度来看,相当标准的做法是,在客户端启用预测,“抢先一步”了解玩家将执行的操作,但代价是玩家在屏幕上看到的内容与游戏中实际发生的内容之间偶尔会出现不一致。 要减少这种不一致情况,可以使用外推或内插等机制来确定游戏对象的显示位置,从而应用对延迟的补偿。

从基础结构角度来看,玩家到游戏服务器的距离越远,最终的延迟时间就越长。 将玩家连接到距离其最近的游戏服务器会产生积极影响。 Azure 具有比任何其他云提供商更多的全局区域,提供可使您与世界各地的玩家更接近的规模。 加速网络可以减少服务器端的延迟,但请记住,它只有在具有至少 4 个 vCPU 的虚拟机中才能启用。 此外,如果您打算使用 Linux 虚拟机,当同一虚拟机中有大量玩家时,您可以考虑使用 DPDK 来优化延迟和吞吐量。

对于支持组群的游戏,需要处理组群中不同成员之间距离较远的情况。 在游戏中,添加手动选择要连接到的区域的功能,或添加最低延迟的公分母算法。

在缓解措施无效的情况下,网络延迟可能会达到无法控制的水平。 当发生这种情况时,需要采取更有力的措施,例如将延迟时间最长的玩家断开连接。

提示

最佳做法是,启用遥测功能来测量玩家的延迟情况,并将其与 QA 团队或 Beta 版测试人员的反馈机制相结合,这样在他们遭遇延迟时您可以即时了解相关情况(例如:组合键、游戏手柄按钮组合、屏幕上的图标)。 通过这两种方法,将更容易找出导致玩家感到延迟的原因。

协议

对于需要实时通信的游戏,最佳做法是通过用户数据报协议 (UDP) 进行传输。 与传输控制协议 (TCP) 相比,该协议的实现往往更为复杂,但在性能方面有显著改善。

对于异步或回合制通信,通过 HTTPS 利用 JSON 就足够了。

每个游戏会话的并发玩家数

从只有 2 个玩家的井字游戏运动,到 100 个玩家决战到最后一人的大逃杀游戏,再到成千上万的玩家参与的一些持久性的世界游戏,同一游戏会话的并发玩家数会影响要使用的体系结构和服务。 这些用例中考虑的三个范围是:

  • - 10 个或更少的并发玩家。
  • - 11 到 50 个之间的并发玩家数。
  • - 超过 50 个并发玩家。

最佳做法

容量规划至关重要

与任何扩展服务一样,花费时间来规划所需的适当实例数是至关重要的一步。 如果使用的实例太少,性能将下降。 如果使用过多,则会带来不必要的费用。

尽早测试并为您自己提供时间。 在发布游戏之前,尽早运行概念证明以及一个或多个测试版,以了解您的玩家在一天中何时使用最多,以及您将使用多少容量来提供支持。

确保您的软件具有可扩展性,并且一切准备就绪,让玩家在从登录和匹配到游戏服务器本身开始就能享受游戏的乐趣。 在每次并发玩家数增加零时,在不同的玩家并发级别(100、1,000、10,000、100,000 等)进行测试,您可能会发现新的瓶颈,并且必须对此进行一些调整。

部署方法

如果您利用了虚拟机规模集、Service Fabric 或批处理,请使用单个群集多个虚拟机规模集以及每次按 1-4 个节点少量增加的规模。 请记住,利用多个虚拟机规模集将加快扩展速度,但会增加成本。

在早期测试中捕获日常工作负载后,就可以使用这些信息来主动(在需要容量之前的一小时)规划扩展操作。

避免更改基础结构

充分利用 Azure 逻辑应用,并尽量避免更改基础结构。 保持运行实例的暖池将可以让玩家立即进入游戏,但也会增加您的成本。

故障防范

如果虚拟机出现故障,您的游戏会话会发生什么情况? 根据游戏类型和您希望在实现中增加的复杂程度,有几种可供选择的方案。

对于会话持续几分钟的快速签入/签出游戏,您可以考虑不进行任何操作并让玩家回到大厅重新开始,因为这对玩家的影响可能不会太糟。 如果您面对的是一个持久的世界级游戏,虚拟机发生故障可能是一个更为严重的问题,您可能需要在保留玩家状态的同时自动将他们移动到新服务器。

使用监视服务确定节点是否已发生故障并启用警报。 您也可以考虑保留发生故障的虚拟机以查明出现环境故障的原因,或直接将其删除。

其他资源和示例