FrameSync

Unity 锁步(Lockstep)帧同步网络框架 — TCP+KCP 双通道、确定性战斗、预测回滚、录制回放

← QWER Game
TCP+KCP
双通道网络
Fix64
确定性数学
15ms
Tick 间隔
2-8
支持玩家数
67fps
帧速率
~13KB/s
带宽消耗

📦 核心特性

双通道网络

KCP(UDP) 主数据通道 + TCP 可靠回退,自动切换,心跳 264ms

确定性模拟

Fix64 定点数 + xorshift128 确定性随机,跨平台位级一致

战斗框架

技能/Buff/状态系统,可扩展 CombatEntity + SkillEffect 架构

预测回滚

客户端本地预测 → 服务端确认 → 自动回滚重放,操作零延迟感

断线重连

完整帧历史回放 + 自动追帧,掉线后无缝恢复

录制回放

输入流录制 + 离线播放器,支持播放/暂停/步进/快进

房间匹配

TypeScript 房间服务器,QuickMatch / 房间号 / 队列三种模式

可视化调试

TickTimelineViewer 实时事件时间轴、同步校验 TSV 导出、速度控制

🏗️ 分层架构

View 层 ← 插值渲染,跟随模拟层 Simulation ← 确定性 Tick,Fix64 数学 Runtime ← TCP+KCP 双通道,Protobuf 消息 Transport ← KCP 协议实现 + 托管 UDP/TCP Routing ← 消息路由 + 加密

🔄 帧同步管线

服务端 (每 15ms Tick): BroadcastServerTick() → 收集每玩家指令 → 广播 S_RTS_FRAME_DATA 客户端 (每 Unity 帧): DispatcherMsg() 收网络消息 ProcessServerFrame(): 处理权威帧 RollbackToAuthoritative() 回滚到官方状态 Gap Fill (补空帧) 逐帧 UpdateMovement + Tick ApplyPlayerCommands() 应用全部玩家指令 RestorePredictions() 恢复未确认预测 SaveAuthoritativeSnapshot() 保存权威快照 (服务端确认的 MoveTarget) FlushPendingCommands() 30ms 间隔发送本地指令 UpdateMovement() 预测移动 (未确认指令)

🎯 预测与回滚

玩家点击 → QueueUnitCommand() 立即生效预测 → 服务端帧到达 → RollbackToAuthoritative() 回滚 → 应用官方指令 → 恢复未确认预测

关键设计:权威快照只存服务端确认的 MoveTarget,用纯 Fix64 公式计算位置。A 和 B 的预测不同,但快照完全相同 → 永不偏离。

🔌 重连追帧

断线 → DS 检测 → 移入 _disconnectedPlayers → 客户端重连 → DS 识别 → 发送 S_RTS_GAME_START + 帧历史 → S_RTS_SYNC_HASH → 客户端 _catchingUp 模式逐帧回放 → 完成

服务端只存非空帧 (~10% ticks),空帧由客户端 while 补齐。超时 3s 无 SyncHash 自动退出追赶。

📊 技术规格

项目
Unity 版本2022.3+ (URP 14.x)
.NETStandard 2.0
确定性数学Fix64 (Q31.32)
序列化Google.Protobuf
网络KCP(UDP) + TCP
Tick 间隔15ms (可配置)
支持平台Windows / macOS / Linux / iOS / Android

🛠️ 运维支持

国内 ISP 网络情况复杂,跨运营商、跨地区、NAT 穿透等因素对线上运行帧同步性能有较大影响。如果你需要运维部署咨询帮助,请邮件或微信联系。

📬 联系方式

微信 & QQ:21039936

jc.liuworld@hotmail.com