中EN
概念页

复制图

Replication Graph

更新于 2026-10-15 约 5 分钟UE5Replication 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 并不保证更快,玩家少时尤其如此;目前也没有淘汰复制图的计划。

  1. Replication Graph in Unreal Engine UE 5.8 文档
  2. Iris Introduction / Migrate to Iris / Iris Components UE 5.8 文档(Iris 介绍与迁移)

相关页面

游戏开发多人网络游戏模型Multiplayer Networking Models多人游戏并不是共享同一份物理现实,而是每位玩家各自看到的近似。历史上主要两条路:对等锁步 (Peer-to-Peer Lockstep)(RTS 仍常用)与权威客户端/服务器 (Authoritative Client/Server)(动作/FPS 主流);后者再叠加客户端预测、插值与延迟补偿,把延迟藏进体验里。游戏开发快照插值Snapshot Interpolation发送端按固定频率拍下世界(或相关子集)的快照,接收端不跑权威模拟,而是把渲染时刻拨回一小段,在缓冲里的两份快照之间插值,用额外延迟换平滑,并扛住抖动与偶发丢包。Source 的实体插值与 clinterp 是同一思想的产品化。游戏开发快照压缩与增量编码Snapshot Compression & Delta Encoding提高快照率以降低插值延迟,必须把每快照比特打下来:有界量化、四元数「最小三分量」、静止省略,以及相对对端已确认基线的增量编码。Source 的 delta snapshot 与 ack 跟踪是同一家族的工程实现。游戏开发 · UE5网络复制与 RPCNetwork Replication & RPCUE 采用服务器权威 (Server-Authoritative) 的客户端-服务器模型:游戏真正在服务器上进行,服务器把状态复制 (Replication) 给客户端,客户端通过远程过程调用 (Remote Procedure Call, RPC) 向服务器请求操作。开发者需要显式声明哪些 Actor、属性、函数要走网络,并借助所有权、网络角色、相关性、优先级控制“发给谁、发多少”。UE 5.8 提供通用复制系统、Replication Graph 和实验性的 Iris 三套复制系统。游戏开发 · UE5专用服务器Dedicated ServerUE 多人游戏采用客户端-服务器模型。监听服务器 (listen server) 由某个玩家的客户端兼任服务器;专用服务器 (dedicated server) 无头运行,不渲染画面,也没有本地玩家。专用服务器体积更小、房主没有不公平优势、能专注于玩法逻辑,适合大规模或竞技游戏。构建专用服务器需要源码版引擎和支持客户端-服务器的 C++ 项目,并要有 <ProjectServer.Target.cs。游戏开发 · UE5配置文件系统Configuration FilesUE 的 .ini 配置按类别(Engine、Game、Input……)分层加载:从引擎 Base 文件到项目 Default 文件,再到平台文件和用户文件,后加载的同名键覆盖先加载的。数组可以用 +、-、! 等运算符跨层增删。UCLASS(config=X) 加上 UPROPERTY(Config) 可以让类的默认值从 ini 自动读取;命令行 -ini: 可以临时覆盖。图形学空间数据结构Spatial Data Structures空间数据结构把几何体按 n 维空间组织起来,通常是层次化的树,使"几何体是否重叠"一类查询从 O(n) 降到大约 O(\log n)。常见类型有包围体层次 (BVH)、BSP 树(轴对齐的 k-d 树与多边形对齐两种)、四叉树/八叉树(含松散八叉树),以及更偏向组织模型关系的场景图。它们是剔除、光线求交、碰撞检测等加速算法的基础。游戏开发 · UE5世界分区World Partition世界分区 (World Partition) 是 UE5 的自动数据管理与基于距离的关卡流送 (Level Streaming) 系统:整个世界存为一个持久关卡,按可配置的运行时网格划分为单元格 (Cell),由流送源 (Streaming Source,默认是玩家控制器) 按距离加载/卸载。它配合一 Actor 一文件 (One File Per Actor, OFPA) 支持多人协作编辑,用数据层 (Data Layers) 按玩法状态切换内容,用分层细节层次 (Hierarchical Level of Detail, HLOD) 在远处以代理网格显示未加载的单元格。游戏开发空间分区Spatial Partition空间分区 (Spatial Partition) 把对象按位置存进空间数据结构,使“找出某位置附近的对象”这类查询不必遍历所有对象,把 O(n) 或 O(n^2) 的操作降下来。最简单的是固定网格;还可以选层次结构(四叉树、BSP、k-d 树、BVH),以及边界固定或随对象自适应的划分方式。代价是对象移动时要更新结构,并且要额外占用内存。综合游戏编程模式选型:解耦与性能Choosing Game Programming Patterns本页把《Game Programming Patterns》里的 19 个模式放到同一张取舍图上:大多数模式要么为了解耦(降低改代码时需要装进脑子里的知识量),要么为了性能(利用对数据和硬件的具体假设),而这两个目标经常互相拉扯。下面先讲全书的定位和 Nystrom 的架构观,再给出按问题选模式的路线和与 UE 的对照。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原