
多人游戏托管深入解析:命运2

Destiny 2 是一款典范游戏,利用多种在线服务实现流畅的游戏体验。本文探讨 Destiny 2 如何有效运用点对点(P2P)联网和权威服务器,打造沉浸式多人游戏体验。
游戏中的混合服务器技术:深入探讨《命运2》的网络模型
由 Bungie 开发的《命运2》(Destiny 2) 结合了两种网络技术,创造了一种混合模型,使其与大多数在线射击游戏区分开来。他们的解决方案结合了两种传统方法的优势,同时减轻了它们固有的一些缺陷。
本文借鉴了我们深入报道过的两次 GDC 演讲:Justin Truman(现为 Bungie 工作室负责人)在 GDC 2015 上关于《命运》网络化任务架构的演讲(Destiny 2's Network Architecture - Multiplayer Game Deep Dive),以及 John Chu(现为 Bungie 首席技术项目经理)在 GDC 2022 上关于在七个平台构建跨平台游戏的演讲(Developing Destiny 2's Crossplay - Game Backend Deep Dive)。
理解点对点(Peer-to-Peer)和客户端-服务器(Client-Server)模型
要理解 Bungie 的方法,有助于了解他们结合的这两个基石。点对点网络是一种直接通信的形式,其中客户端(玩家)之间直接互动,无需中间媒介。其主要优势在于较低的延迟。然而,它往往会引发安全和隐私问题,我们将在稍后探讨。
另一方面,客户端-服务器模型通过承载游戏的专用服务器运行,提供稳定性和一致性,但由于玩家和服务器之间的地理距离,可能会引入延迟。
《命运2》独特的混合模型
正如 Truman 所描述的,Bungie 自始至终的目标就是“模糊单人游戏和多人游戏体验之间的界限”,让玩家只需点击“开始《命运》”即可遇到其他玩家,而无需传统的匹配大厅。要实现这一点,需要一种不同于任何传统专用服务器或纯 P2P 方法单独所能提供的网络模型。
该解决方案由三个不同的层并行工作。
共享区域 (P2P):第一层是 P2P 层。共享区域内的玩家相互之间直接通信,形成 Bungie 所称的点对点“气泡 (bubbles)”。这些是直接的客户端到客户端连接,以保持移动和瞬间互动的极高响应性,并使 Bungie 能够将这些“气泡”连接在一起,从而使陌生人可以在任务中自然相遇,而无需大厅或加载界面。
物理主机(专用服务器):第二层是物理主机,在《命运2》中,它运行在专用服务器上,而不是玩家的机器上。这是对《命运1》最顽固问题之一——主机迁移(host migration)的有针对性的修复。当托管物理的玩家离开会话时,游戏会卡顿或完全崩溃。将该职责移至专用服务器消除了对任何单个玩家连接的依赖,无论谁加入或离开,都能使会话保持稳定。
活动主机(专为任务状态构建的权威进程):第三层是活动主机,这是一个精简的云进程,Truman 的团队设计它仅用于运行任务逻辑严格需要的状态。不需要弹道轨迹,不需要动画状态,也不需要世界空间位置。只需活动脚本需要的离散事实:小队是否已生成、还有多少敌人存活、目标是否已触发。其结果是一个大小约为 45MB、运行频率为 10Hz 的可执行文件,这使得单台 40 核服务器能够处理接近 5,000 个并发实例。正如 Truman 解释的那样,这转化为仅由几百台机器支持的约 100 万并发用户。而全模拟的专用服务器方法则需要接近 50 万个无头进程来运行整个游戏。
使这成为可能的核心规约是 Bungie 所称的“传感器 (sensors)”:一个声明优先的系统,脚本在引用某个状态之前必须正式声明它需要该状态。
任何东西都不会意外地漂移到服务器上。如果脚本没有声明依赖关系,该状态就不会在服务器端持久化。这使活动主机的占用空间保持很小,带宽可预测,并保持了架构的诚实性。
在从《命运1》到《命运2》的过渡中,这三层共同取代了玩家托管物理模型的单一脆弱点。当 Bungie 最终推出跨平台游戏时,John Chu 将所需的底层网络更改描述为引擎中“一些最大、最可怕的伤筋动骨的更改”,这正是因为该分层架构必须重构,以便在先前独立开发和优化的平台上载送一致的状态。
《命运2》混合模型的挑战
Bungie 自己的工程师将他们的网络拓扑描述为“异常复杂”。面向玩家的结果也证实了这一点。
IP 暴露是 P2P 的结构性后果,而非缺陷。在任何点对点设置中,客户端都直接相互通信,这意味着你遇到的每个玩家都可以看到你的 IP 地址。在《命运2》中,无论在 PvE 还是 PvP 中,每个玩家都是如此。正如 Chris "Battle(non)sense" 在 2017 年 PC Gamer 的分析中所观察到的,PC 版本仍然带着一套专用服务器游戏根本不会面临的明显权衡:
“游戏会向你遇到的每个人大声说出你的 IP 地址,第三方工具的叠加层无法工作,游戏捕捉工具的功能在某些情况下受到限制,命中判定的响应能力因玩家而异,有些玩家会遇到所需的上行带宽问题,而这在专用服务器上很少发生。”
对于考虑混合模型的游戏工作室来说,IP 暴露值得作为一级设计约束来对待。在没有同伴之间的中继层的情况下,P2P 和 IP 隐私从根本上是不兼容的。
安全问题也加剧了这一点。当客户端在 P2P 环境中处理命中判定等敏感任务时,游戏变得更难防御外挂。多人游戏开发中的通用原则是“永远不要信任客户端”。在混合模型中,这一原则变得更难干净利落地执行。
网络代码:破绽百出之处
注:以下信息基于 Chris "Battle(non)sense" 于 2017 年为 PC Gamer 进行的网络测试;某些具体细节可能随着后续的后端更新而有所改变。
在专用服务器游戏中,你的命中判定延迟取决于一个变量:你到服务器的 Ping 值。一致、可预测,且不受比赛中其他任何人的影响。
P2P 则完全消除了这种保证。正如 Chris 所指出的,“玩家网络连接的质量以及他们之间的距离,对命中判定的灵敏度有直接影响。”一个以 15Hz 而不是预期的 30-40Hz 发送更新的玩家,会明显拉长你与他们之间的延迟,无论你自己的连接有多稳固。一个玩家糟糕的上行带宽会降低与他们连接的每个人的体验。而且处于带宽容量有限的家用网络连接上的玩家数量,超出了大多数开发者的预期。
专用服务器在中心吸收了这种多变性。P2P 则将这种多变性分配到比赛中的每一个同伴关系中。
出于同样的原因,带宽很难随着玩家人数的增加而进行扩展。在 4v4 Crucible(熔炉竞技场)的一小时中,Chris 测量到单个客户端发送了 152.3MB 并接收了 128.3MB。在 P2P 拓扑中,增加玩家会使每个方向的流量成倍增加。这一计算很可能促使 Bungie 决定将 Crucible 的人数上限控制在 4v4,而不是 5v5 或 6v6。围绕混合模型进行设计的游戏工作室应该尽早运行自己的带宽预测,特别是针对更多的玩家人数。
最后,滴答率(tick rate)在这里也有其独特的微妙之处。《命运2》以 30Hz 的频率对战斗伤害进行采样(传闻中流传的 10Hz 指的是活动主机,它以较低的频率处理得分和弹药生成)。在 PC 上,当帧率超过 40fps 时,客户端可以以高达 40Hz 的频率发送更新,这在渲染性能和网络更新率之间建立了直接耦合,在专用服务器架构中没有等效项。
Private Fleet:大规模混合编排
对于运行像《命运2》这样规模的基础设施的工作室来说,服务器编排成为了核心的工程考量。
Edgegap 的 Private Fleet 是一种基于容器的编排解决方案,它可以处理持久服务器以优化成本,然后通过即时部署和在全球 615 多个地点的全球服务器部署自动爆发到云端。邻近托管将玩家放置在最近的可用服务器上,从而将延迟平均降低高达 58%,而无需工作室自己构建和管理该基础设施。
结论
《命运2》所采用的混合网络模型既说明了融合服务器架构的可能性,也说明了其真实成本。它证明了将 P2P 的灵活性与专用服务器的权威性相结合,可以大规模提供无缝的共享世界体验,但它需要细致的工程设计来解决随之而来的安全性、延迟和一致性挑战。上面链接的两次 GDC 演讲深入探讨了 Bungie 在实践中是如何解决这些问题的,非常值得与本文一起阅读。
—
本文借鉴了 Justin Truman 的 GDC 2015 演讲、John Chu 的 GDC 2022 演讲,以及 PC Gamer 于 2017 年 11 月发表的由 Chris "Battle(non)sense" 进行的网络分析中的见解。原始内容的所有权利归其各自所有者所有。
书写者
Edgegap团队








