UE网络复制中的可靠函数是什么意思 什么时候要勾选什么时候不勾?
什么是 Reliable(可靠)函数?
在 Unreal 网络里,RPC(函数复制/远程调用)可以标为 Reliable 或 Unreliable。
Reliable 的意思是:引擎会不断重发这个网络包直到接收方确认收到(ACK),并保证在同一个 Actor 上按调用顺序 最终被执行。如果丢包会被重发,且可靠 RPC 会在处理队列里造成“等待”,影响后续可靠调用的处理。Epic Games Developers+1
Unreliable(默认)则是“发就发”,丢了就丢、不重传;通常延迟小、开销小,但不能保证一定到达或顺序。
Blueprint 中“勾选 Reliable”是什么意思?
勾选就是把该 RPC 设置成 Reliable(可靠)。在 C++ 是用 UFUNCTION(Server, Reliable) / UFUNCTION(NetMulticast, Reliable) 等标注实现。默认不勾(Unreliable)。Unreal Engine
示例(C++):
UFUNCTION(Server, Reliable) void Server_DoImportantThing();
什么时候要勾(应该用 Reliable)——简单规则
勾 Reliable 的情况通常是低频且重要、不能丢的事件,例如:
-
持久状态的关键改变(买/卖物品、切换武器、背包变化、存档类事件)。Epic Games Developers
-
必须保证到达的单次命令(玩家确认加入队伍、打开/关闭关键门、匹配开始/结束、玩家死亡/复活通知)。
-
某些需要服务器强一致性的事务(交易、授权、评分结算)。
什么时候不要勾(应该用 Unreliable)
不要把高频或可被覆盖的事件设为 Reliable,例如:
-
每帧/每 tick 的移动/输入/位置更新(位置用专门的 Movement Replication / CharacterMovement)。
-
频繁的视觉/音效事件(如果漏一次不会严重影响游戏)。
-
重复、可被后续消息替换的信息(比如连续的瞄准角度更新,只需要最新值)。Game Development Stack Exchange+1
为什么不能随便都用 Reliable?(成本与风险)
-
带宽/延迟成本高:可靠需要重传与确认,会增加网络流量与延迟。Epic Games Developers
-
头阻塞(head-of-line):一个可靠的调用没被确认,会阻塞同一连接/同一 actor 上后续可靠调用的处理,从而导致延迟累积。Epic Games Developers+1
-
过多可靠调用会导致性能/稳定问题:大量可靠事件会填满缓冲、甚至导致连接问题或“卡住”。所以要尽量把高频事件做成不可靠或合并打包。Game Development Stack Exchange
实战建议(Checklist)
-
想:这个消息丢了会让游戏错乱吗? 是 → Reliable;不是 → Unreliable。
-
如果消息很频繁,优先考虑 不可靠 + 序号/时间戳(客户端/服务端用序号保证客户端只应用最新的),或用 属性 Replication / OnRep 来同步最终状态。Epic Games Developers+1
-
将“开始/结束”事件 Reliable(例如:开始开火、停止开火),而把“每一帧子弹生成/每帧位置”用不可靠或用服务器侧模拟。GameDev.tv
-
合并参数:把多个小事件合并成一次可靠调用,减少可靠消息数量。
-
测试:在有丢包/高延迟条件下测试,看是否会出现顺序或卡顿问题。
常见误区
-
“Reliable 就一定更快/更好” —— 非也。Reliable 保证到达,但可能更慢(等待确认与重传)。
-
Reliable 会保证跨 Actor 的顺序 —— 不保证。只保证同一 Actor上可靠 RPC 的执行顺序。跨 Actor 的调用顺序不可依赖。
