复制图
Replication Graph
复制图 (Replication Graph) 插件解决的是服务器 CPU 瓶颈:标准做法是让每个复制 Actor 对每个连接各自判断是否需要发送,玩家和 Actor 一多(Fortnite 大逃杀开局有 100 名玩家、约 5 万个复制 Actor)就撑不住。复制图由持久存在的节点组成,按空间网格、休眠、常驻相关等规则预先分组,并缓存可跨帧、跨连接共享的复制列表。
问题
标准复制策略要求每个复制 Actor 对每个已连接的客户端判断是否需要发送更新,在大规模游戏中表现很差,会成为服务器 CPU 的瓶颈。分批错开更新或者干脆降低更新频率能缓解,但会降低更新频率、损害客户端体验。复制图让 Actor 不必逐个评估每个客户端,在不牺牲体验的前提下解决了 CPU 问题。(Replication Graph in Unreal Engine)标准的相关性与优先级机制见 网络复制与 RPC。
结构
复制图包含一系列复制图节点,负责按需为每个客户端构建要复制的 Actor 列表。因为它由持久对象构成,而不只是复制 Actor 自己执行的函数调用,数据可以跨帧保存并在多个连接之间共享,这就是生成列表变快的原因。节点的最终任务是尽快把「复制列表」交给每个连接,使服务器在每个 Actor、每个客户端上花的 CPU 周期尽可能少。官方鼓励按游戏需要编写自定义节点。(Replication Graph in Unreal Engine)
flowchart TD RG["复制图"] --> G["空间网格节点<br/>按格子存可能被看到/听到的 Actor"] RG --> AR["常驻相关节点<br/>对所有人都相关的 Actor"] RG --> DM["休眠列表<br/>预放置、长时间不变的 Actor"] RG --> OW["随拥有者更新<br/>被携带的武器、装备"] G --> L["每个连接的复制列表"] AR --> L DM --> L OW --> L
图中各节点按不同规则把 Actor 分组,最后拼成每个连接各自的复制列表。
官方给的大规模设计思路
| 思路 | 做法 |
|---|---|
| 按位置分组 | 大逃杀、MOBA、MMO 把世界分成网格;地牢或走廊类射击游戏按房间或区域划分。把 Actor 放进所有能看到或听到它的格子里,客户端相机所在格子的持久列表直接可用 |
| 识别休眠 Actor | 预放置、在玩家交互前不变的 Actor 单独列出。例如一棵树长期休眠,被破坏时只更新给能看到它的客户端,被摧毁后再也不需要更新 |
| 随拥有者更新 | 被拿在手里或穿戴的物品(独立 Actor 时)放进特殊分组,只在拥有者更新时一起更新 |
| 常驻相关 | 对所有玩家都相关的特殊 Actor 放进一个简单节点,不进其他列表浪费计算 |
(Replication Graph in Unreal Engine)按位置分组正是 空间数据结构 中网格划分的思想,在网络层的应用。
启用
复制图是复制驱动 (Replication Driver) 的子类。可以在 DefaultEngine.ini 的 [/Script/OnlineSubsystemUtils.IpNetDriver] 节中设置 ReplicationDriverClassName(见 配置文件系统),也可以在代码中绑定。ShooterGame 示例项目是很好的参考。(Replication Graph in Unreal Engine)
取舍
复制图的效果取决于游戏专属的节点设计,需要投入工程量;小规模游戏用标准复制往往就够了(这是归纳)。
与 Iris 的关系
官方 5.8《Migrate to Iris》写明:Iris 不支持复制图,两者是互相独立的系统,网络驱动 (Net Driver) 只能使用其中一个。Iris 没有复制图意义上的「节点」概念,而是用网络对象过滤器 (Filter) 和优先级器 (Prioritizer) 替代复制图的功能。(Iris Introduction / Migrate to Iris / Iris Components)
| 维度 | 复制图 | Iris(5.8 实验性) |
|---|---|---|
| 组织方式 | 持久节点 + 缓存的复制列表 | 量化状态副本 + 按类型共享的复制协议 |
| 相关性 | 节点(空间网格、常驻等) | 过滤 (Filtering) |
| 优先级 | 节点内逻辑 | 优先级器 (Prioritization) |
| 状态变化检测 | 沿用通用系统 | 力求完全推送 (push-based);未启用推送模型时按 NetUpdateFrequency 轮询 |
| 跨连接共享 | 共享列表 | 共享量化数据和工作,便于并行 |
| RPC | 与通用系统相同 | 与通用系统和复制图相同 |
(Iris Introduction / Migrate to Iris / Iris Components)Epic 员工在论坛上的回复(非文档,未抓取全文)提到:Iris 并不保证更快,玩家少时尤其如此;目前也没有淘汰复制图的计划。
出处
- Replication Graph in Unreal Engine UE 5.8 文档
- Iris Introduction / Migrate to Iris / Iris Components UE 5.8 文档(Iris 介绍与迁移)