如何为您的游戏选择正确的网络代码

几乎所有的多人游戏都必须考虑并解决影响游戏体验的固有网络相关难题,如延迟、数据包丢失和场景管理。游戏可以通过各种方式解决这些难题。
找到正确的解决方案取决于游戏的类型、玩家和联网对象的规模、竞争性以及其他方面,例如需要对网络层进行多少控制。不同的场景需要不同的网络代码解决方案。
在本博客中,我们将介绍 Unity 引擎中使用的常用网络库,以及针对开发人员使用这些解决方案的经验所做的研究结果,以帮助您确定哪些解决方案适合您的项目。
Netcode 是一个高级术语,许多工程师都用它来指代专门用于帮助更轻松地构建网络游戏某些方面(如数据同步或延迟补偿)的框架。
一个完全联网的框架包含两个基本组成部分:
1.传输(基础)层,管理所有发送到/来自客户端、主机或服务器的流量和数据包
2.更高层次的抽象层,可简化常见的网络游戏需求并与工具集成
通常,"网络代码解决方案 "指的是第二个抽象层,因为这是您实现网络游戏和优化的地方。
不同的网络代码解决方案有不同的限制和功能,这可能会使您更容易或更困难地构建多人游戏体验。重要的是,在开始之前,要清楚地知道自己想要构建什么,并评估自己的选择,以帮助减少可能代价高昂的重构。
Unity 有两种不同的第一方网络代码解决方案:游戏对象的 Netcode 和实体的 Netcode。
Netcode for GameObjects 软件包可帮助您更轻松地跨多个客户端和平台同步场景和 GameObjects 数据,并可使用客户端或服务器授权模型。Unity 引擎可帮助您优化多人游戏,其工具可在 "播放 "模式和运行时对网络进行配置。
您还可以使用 Unity Gaming Services 的 Relay(一种具有成本效益的点对点同伴服务)来扩大游戏测试规模和构建多人游戏,而无需投资专用托管服务。
在即将推出的 Unity 2022 LTS 中扩大可能性的范围。使用基于 ECS 的 Netcode for Entities 软件包,增加针对动作竞技类多人游戏的能力,该软件包专为性能和可扩展性而设计。您可以将目标锁定为具有预测、插值和延迟补偿功能的服务器权威游戏。
利用可自动剥离资产的专用服务器构建目标来管理成本。使用 Unity Gaming Services 提供的游戏服务器托管服务进行部署,这是一种简化的方法,可以保持游戏基础设施的弹性和可扩展性,这样您就可以专注于为玩家提供最佳体验。
Unity 收集了一些使用最广泛的第三方网络代码解决方案的反馈意见,我们创建了一个决策树,帮助指导您决定哪种框架最适合您。
为了创建这些工具,我们收集并分析了三个来源的数据:
- 对 200 多名 Unity 用户进行调查,了解他们使用特定网络代码框架的经验
- 对积极使用 Unity 开发多人游戏的用户进行了 20 多次深入访谈
- 从我们使用 MLAPI(现称为 GameObjects Netcode)、DarkRift 2、Mirror 和 Photon Quantum 构建的原型中汲取经验。
客户根据自己的经验,从不同的角度对顶级网络代码解决方案进行了评分和排名。
网络是复杂的,因此您通过网络代码解决方案获得的稳定性和支持水平至关重要。对每种网络代码解决方案的稳定性和支持性进行了三方面的评估--出现错误或崩溃的可能性、解决问题或帮助调试难题的响应时间,以及对应用程序接口进行破坏性更改的可能性。
我们汇编了用户对上手和执行常见任务的容易程度的评价,包括提供良好的示例、文档、教程以及解决方案提供的用于原型开发的简单应用程序接口。
谁想要性能低下的解决方案?为了对每个评估过的网络代码解决方案进行评分,我们关注的是有限的 GC/分配、最小的延迟开销、高性能计算,以及理想情况下的多线程能力。
根据您要创建的游戏类型,网络代码解决方案的可扩展性是一个重要的考虑因素。与性能类似,我们评估了解决方案在不大幅降低性能的情况下支持更多连接客户端的能力。
拥有功能齐全的网络代码解决方案对于支持任何类型的游戏或满足项目的特定需求非常重要。在对解决方案进行排名时,我们重点关注中层功能,如对象和变量复制、RPC、场景管理等。我们还寻找更高级别的功能,如预测和滞后补偿。
为了合理安排网络代码解决方案的预算,我们还对每种解决方案的成本进行了评估。这一考虑因素既包括图书馆/解决方案的成本,也包括可能的隐性成本,如必须单独管理的运营管理费用。
在决定使用网络代码解决方案之前,有必要考虑以下几点。
首先,我们强烈建议您仍然自行进行评估。我们总结的最常见选择可能会有所帮助,但您也应该根据自己比赛的具体情况进行评估。
其次,该列表基于 2020 年的评估运行,并不代表目前可用的所有网络代码或传输层解决方案。
最后,考虑您准备承担多少与网络相关的额外工作和维护。你的游戏需要那么多网络开销吗?
如果您制作的是休闲游戏或合作游戏,不需要所有玩家的状态在不同设备上完全同步,那么可以考虑使用开销和开发成本更低的 Netcode 解决方案,如 GameObjects Netcode。
如果您正在制作一款节奏更快、更注重动作的游戏,在游戏中玩家的身体技能将相互竞争,那么可以考虑使用 Netcode for Entities 这样的解决方案。这可以支持客户端预测等功能,并有一种补偿滞后的方法。
下面的信息只是一个开始,但我们建议您同时下载完整的网络代码报告,我们将在报告中更详细地介绍这些第三方网络代码解决方案:
- MLAPI(现已被 Unity 收购,并发展成为GameObjects 的 Netcode)
- DarkRift 2
- 光子 PUN
- Photon Quantum 2.0
- 镜子
注意:PDF 文件涵盖了客户引用最多的解决方案,但还有更多。一些客户讨论了其他解决方案,但我们尚未收集到足够的客户证据对其进行评估,例如 Forge、Normcore、Bolt、LL(Enet、LiteNet 等)。我们鼓励您将这些添加到您的考虑中,看看它们是否适合您的设置。

无论您是要制作下一款大受欢迎的对战游戏,还是要制作一款舒适的在线合作游戏,了解多人联网的基础知识和可用的网络代码解决方案都是至关重要的。
有关使用 Netcode for GameObjects 制作的高质量项目示例,请参阅 Unity 的Boss Room合作示例。如果您正在寻找一个快节奏、竞技性强且具有网络性能的多人游戏示例,请查看使用实体组件系统构建的 UnityECS 网络赛车示例。要查看充分利用游戏服务器托管所提供的一切功能的游戏示例,请查看使用 Photon Fusion 构建的大逃杀示例。
创作快乐
编者注本博客于 2023 年 3 月更新,加入了有关 Unity 网络代码解决方案的最新信息,以便为开发人员选择适合其游戏的网络代码解决方案提供更多有用信息。报告数据仍来自 2020 年。