网络同步与弱网断线重连
ABSTRACT
融合 UE4 复制模型详解与腾讯天天系手游弱网实战两篇素材,覆盖网络同步的两个侧面:引擎层(UE4 的连接所有权、属性复制、RPC 语义)与传输层(TCP 长连接下的包序防重、下行缓存、断线重连补发)。共同原则是「服务器权威 + 序号化 + 可恢复」,移动端弱网场景至今沿用。
UE4 复制模型(引擎层)
- 连接所有权是同步的锚点:Actor 经 owner 链 / Pawn Possess / owner 是带连接 Pawn 三种途径归属某连接;归属者 Role=ROLE_AutonomousProxy,其余为 ROLE_SimulatedProxy。判断服务器不能看 Role,要走 NetDriver/Connection(GetNetMode)。
- 属性同步:UPROPERTY(Replicated) + GetLifetimeReplicatedProps;服务器为每个 Actor 维护属性变化表(FRepLayout),变化才推送;OnRep 回调以客户端新旧值不同为准;休眠 Actor 不同步。
- 条件复制:COND_InitialOnly 只在初始 bunch 同步一次(姓名、性别类不变量),值必须在创建当帧设好;COND_AutonomousOnly 等按归属过滤。
- RPC 矩阵:调用端 × Actor 归属 × RPC 类型(Server/Client/Multicast)决定执行位置;不合理调用被引擎丢弃(防作弊);Unreliable 多播做相关性检查,Reliable 多播必达但慎用。
- 次序铁律:RPC 先于属性同步到达——「创建 Actor 同帧发 RPC 传该 Actor」客户端收到 NULL;服务器改值与 RPC 改同一属性会让 OnRep 不触发。
- 组件同步:静态组件随 Actor 序列化,与自身标记无关;动态组件必须 SetIsReplicated(true)。
- 结构体同步:UStruct 整体复制、成员 NotReplicated 排除;成员不可单独标 Replicated;UStruct 数组成员必须标 UPROPERTY。
弱网与断线重连(传输层,TCP 长连接实战)
- 上行包序防重:客户端发序,服务器记录最近值,≤ 即丢弃——购买类消息防多次扣费,实现幂等。
- 下行包序防重:服务器发序,客户端过滤已处理包,防数值与界面异常。
- 下行包缓存池:服务器为每个 player 开辟环形缓存(案例为 20K / 约 500 条),消息打包压缩后入池,双游标 BeginBuf/EndBuf。
- 重连补发:客户端带最近下行包序直连 gamesvrd;服务器用 tempBeginBuf 试发、不急着移动 BeginBuf——重连再失败时消息可重发,等价于两阶段提交。
- 黑名单:登录/登出回复、踢下线通知等不缓存。
- 运营闭环:统计每分钟重连发起与成功次数,量化监控。
跨层通用原则
- 服务器权威:一切同步由服务器决定,客户端只做过滤与表现。
- 序号化 + 幂等:包序/属性变化表都是「只在变化时传递 + 防重复处理」。
- 断点可恢复:下行缓存补发让重连对玩家透明;客户端侧则回归游戏初始化状态重建数据(见 Indra 框架笔记 的 GameInit 回归设计)。
- 少同步、多预测:预测技术可减少需关心的同步属性(客户端预测 + 服务器和解)。
关联概念
来源回溯
- UE4 网络同步详解(一):理解同步规则
- 腾讯天天系某百万大作的弱网处理及断线重连方案
- 游戏框架:Unity 中的积累(Indra 项目实现方案)(预测同步与 GameInit 回归)