本文内容
Multiplayer Gem 概述
在 Open 3D Engine (O3DE) 中,多人游戏支持所需的同步是通过 多人游戏组件 执行的。与 O3DE 中的其他组件一样,这些组件附加到 实体。多人游戏组件可以接收 远程过程调用 (RPC),这是来自远程源的函数调用。多人游戏组件还定义要通过网络同步的数据。每个多人游戏组件(通常生成为 auto-component)定义其自身对其他数据的要求,并定义哪些函数可用。
O3DE 多人游戏 Gem 中提供的一些功能包括:
- 基于角色的同步和复制规则
- 本地预测和向后对账(“回滚”)
- 服务器权威异步多人游戏
多人游戏组件
多人游戏组件构建在 O3DE 组件之上,并允许 O3DE 中的实体通过网络相互通信。多人游戏组件可能包含各种有助于定义组件的数据和功能的属性,例如网络属性、远程过程调用 (RPC)、网络输入和原型属性。
多人游戏组件由 auto-components 生成,这是定义组件状态以进行网络同步的 XML 文件。有关通过定义自动组件生成多人游戏组件的更多信息,请参阅 多人游戏自动组件.
事件驱动的消息传递系统
网络属性和 RPC (在多人游戏组件中定义) 是为网络通信提供以下数据和功能的关键属性:
- 网络属性:有关在主机之间复制的组件的状态信息。
- 远程过程调用 (RPC):允许将消息发送到实体上的特定组件。
它们共同代表一个事件驱动的消息传递系统。当网络组件上的属性发生更改时,它会触发事件;同样,当调用 RPC 时,它会向相关组件发送触发器。这意味着 Multiplayer Gem 使用 基于推送 的模型而不是 基于轮询的 模型来同步客户端和服务器之间的信息。使用此模型可以简化代码和实体管理,并且不需要对计时器进行网络状态检查,从而提供性能优势。
重要:多人游戏组件是 O3DE 中实体之间通信的 唯一 内置方式。由于引擎能够跨多个主机分发实体并与之交互,因此无法保证任何两个实体在同一主机上具有权威表示形式。
网络属性
O3DE 多人游戏 Gem 使用 增量复制 在主机之间传输属性更改。增量复制方法使用这样一个系统:服务器维护有关每个客户端的上次确认状态和当前世界状态的信息,然后通过网络发送两种状态之间的差异。当客户端收到此信息时,如果数据包的接收顺序正确,它会更新世界状态。
这种复制样式的一个重要考虑因素是,它要求 Client 端将确认 (ACK
)消息发送回服务器。O3DE AzNetworking 框架提供可靠的 UDP 数据包,包括确认。
在不考虑高级网络功能的情况下,服务器会通过以下方式检查每个帧上的增量:
- 根据每个客户端的已确认状态检查世界状态的快照。
- 如果世界状态与导致
ACK
的最后一个状态不同,则为该客户端生成 delta。 - 将 delta 传输到客户端。
然后,客户端通过以下方式从 delta 更新自身:
- 检查接收到的 delta 是否按顺序。
- 提取 delta 信息并更新世界状态。
之后,AzNetworking 层会意识到世界已更新。此操作通过 ACK 向量复制自动发生,不需要客户端执行任何进一步的操作。
远程过程调用 (RPC)
开发人员可以使用 O3DE 中的远程过程调用来调用远程端点上的函数。RPC 是一种有用的机制,用于跨联网终端节点向事件发送信号和通知事件。与网络属性不同,开发人员选择何时调用 RPC。不保证 RPC 会按照发送顺序到达。O3DE 提供可靠和不可靠的 RPC。默认情况下,RPC 是可靠的。
Reliable RPC 使用队列来保证消息的传递。发送任何可靠数据包时,数据包也会插入到优先级队列中,并为其指定一个超时值,该值与发送消息的连接的延迟相关。超时时,如果未明确确认可靠数据包,则将重新传输该数据包。在接收端,O3DE 客户端跟踪收到的每个可靠数据包,并保证任何数据包只传送一次。虽然此功能提供 保证 交付,但它不提供 订购 交付。
Unreliable RPC 通过“即发即弃”方法发送。发送消息的主机无法确保收到消息。
多人游戏实体角色
由于具有多人游戏组件的每个实体都通过网络进行复制,因此您可以将它们视为同时存在于多个主机上。这种考虑引入了对网络的 权限 问题 - 哪些主机可以优先设置网络状态、定义复制规则和确定主机可以扮演哪些角色。在 O3DE 中,这些角色是有意在编译时强制执行的。Multiplayer Gem 自动分配和处理多人游戏实体的角色。
为 O3DE 多人游戏主机提供的角色包括:
Client (
NetEntityRole::Client
): 组件的最低权限角色。网络属性的最小子集将复制到此角色,并且其行为严格为只读。此角色用于由主机控制的客户端实体,并且应仅包含表示逻辑并充当调用 RPC 的代理。应使用此角色的实体示例包括 AI 和在世界中移动的其他玩家。Autonomous (
NetEntityRole::Autonomous
): 具有写入访问权限的 illusion 的角色。自治角色通常分配给直接受本地用户控制的组件。这些角色接收的网络信息量比 Client 角色大。自治角色还可以利用预测网络。Authority (
NetEntityRole::Authority
): 拥有最终权威的角色。它具有对组件上所有网络属性的完全读取和写入访问权限。
除了前面描述的角色之外,O3DE 还有一个仅在多服务器实例中找到的附加角色:
- Server (
NetEntityRole::Server
): 提供给 * 没有 * 对特定实体有权限的服务器。此角色是严格只读的,与这些实体的所有交互都应使用 RPC 处理。
相关主题
主题 | 说明 |
---|---|
AzNetworking | 了解 O3DE 中构建多人游戏 Gem 的低级网络堆栈。 |
Automate Source Generation from Templates with AzAutoGen | 了解用于为使用多人游戏 Gem 的项目创建 auto-components 的 AzAutoGen 代码生成系统。 |
Multiplayer Gem API 参考 | O3DE 多人游戏 Gem 的完整 C++ API 参考。 |