第八章

网络同步:5v5 怎么“看到同一个世界”

第七层 · 状态同步/帧同步/延迟补偿 两台手机联机,英雄“瞬移”了

一、联机第一晚:两个英雄互相"瞬移"

"云间对决"第一次双机联机测试,小陈和老周各拿一台手机。结果——

小陈:"我看到你的英雄在'瞬移',一下出现在这里,一下出现在那里!"

老周:"因为你手机 30 帧,我手机 60 帧,我们看到的'世界'根本不一样!"

"这就是网络同步(Network Synchronization)要解决的核心问题:让所有玩家看到的游戏世界是一致的。 MOBA 里 5v5 十个人,每个人手机上的英雄、小兵、野怪都必须'同步'——你在上海放了个技能,在成都的队友要'同时'看到。"


二、先搞懂问题:延迟与不一致

"为什么联机会不同步?根源是两个字:延迟(Latency)。"老周画:

网络延迟的现实:
  你在上海,服务器在北京:
  你的操作 → 网络传输(约 30ms)→ 服务器处理 → 传输(30ms)
  → 对方看到你的操作,最少 60ms 之后
  普通网络延迟:20-100ms(毫秒)
  高延迟(跨省/跨国/弱网):200ms+

  延迟带来的三个问题:
  ① 位置不同步:你看到的敌人位置,是 60ms 前的位置
  ② 事件不同步:你放的技能,对方"晚看到"
  ③ 结果不同步:如果两边各自算伤害,结果可能不一样!
     (你这边敌人死了,他那边的敌人还活着——"我明明打死他了!")

"MOBA 最不能忍的就是'两个客户端各自为政'——所以必须有统一的'权威'来决定'世界是什么样'。这就是同步方案的核心。"


三、两种同步方案:状态同步 vs 帧同步

"游戏联机有两大流派,MOBA 类用的是其中之一。"老周说:

① 状态同步(State Sync)—— 服务器权威,客户端"汇报"
   服务器是"唯一真相"(权威服务器 Authoritative)
   客户端:
     操作 → 上报服务器
   服务器:
     计算所有逻辑(移动/伤害/血量)→ 把"最终状态"广播给所有客户端
   客户端:
     接收状态 → 渲染(插值让画面平滑)
   优点:服务器权威,防作弊容易
   缺点:每帧都要传大量状态(带宽大)
   代表:MOBA 手游多数、吃鸡类

② 帧同步(Lockstep/Frame Sync)—— 只传"操作"
   所有客户端本地跑同一套游戏逻辑
   只互相广播"我按了什么键"
   每个客户端按相同输入、相同逻辑 → 推出相同结果
   优点:带宽极小(只传输入)
   缺点:逻辑必须"确定性"(同样的输入必须同样的输出)
        任何一个客户端逻辑不一致 → 世界分叉
   代表:RTS(星际争霸)、格斗游戏、部分 MOBA
帧同步的"确定性"难题(MOBA 用帧同步的代表:早期王者荣耀):
  同样输入 → 必须同样输出,意味着:
    - 不能用随机数(或随机种子要同步)
    - 不能用浮点运算差异(不同手机精度可能不同)
    - 所有逻辑必须在"固定帧率"下跑(第二章的 FixedUpdate!)
  一旦有人逻辑分叉 → 整个世界崩坏

状态同步的代价:
  服务器要算所有逻辑 → 服务器压力大
  每帧传状态 → 带宽大(需要压缩/插值优化)

"一句话:状态同步 = 服务器说了算(重传状态,防作弊好);帧同步 = 大家自己算(只传按键,省带宽但要求逻辑确定)。 王者荣耀早期用帧同步(省带宽),后来部分场景改状态同步(好维护)。咱们的简化版,用状态同步更现实。"


四、状态同步实战:英雄移动的"三步舞"

"选状态同步,那英雄移动怎么实现?"老周写:

状态同步下英雄移动流程:
  客户端A(你)               服务器                客户端B(队友)
     │ 按移动键                 │                      │
     │ 本地先动(预测)           │                      │
     │ ──移动指令──▶           │                      │
     │                        │ 服务器算出新位置         │
     │                        │ ──位置状态广播──▶      │
     │                        │                      │ 收到位置 → 渲染
     │ ◀──服务器确认位置─────── │                      │
     │ 修正本地位置              │                      │
三个关键优化:
  ① 客户端预测(Client Prediction):
     不等服务器,先本地移动(不卡顿)
     服务器返回后,校正误差
  ② 插值(Interpolation):
     收到的位置是"过去"的,在两帧之间平滑过渡
     → 让画面不"跳变"
  ③ 延迟补偿(Lag Compensation):
     服务器判定"你打中了吗"时,回看"你看到敌人时的位置"
     → 避免"我以为打中了,服务器说没打中"

  这是网络游戏的"老三样":预测、插值、延迟补偿

"网络游戏的体验,全靠这三招——玩家感觉'流畅',其实是客户端预测在骗过大脑;'公平',是延迟补偿在兜底。MOBA 的'手感',一半是网络层给的。"


五、同步什么:全量同步 vs 增量同步

"不是所有东西都要每帧同步——同步的内容要有取舍。"老周说:

同步内容分级:
  每帧同步(高频):位置、移动方向(角色、弹道)
  事件同步(触发时):技能释放、伤害、死亡、Buff
  低频同步(隔几秒):血量、蓝量、金币、等级
  结算同步(对局结束):胜负、数据统计

  带宽优化:
    位置同步:只传"增量"(位移向量,不传完整坐标)
    或者:定时快照 + 差值
    事件:用紧凑协议(二进制替代 JSON)
    压缩:数值用短整型/位打包

  示例(英雄位置增量):
    每帧:{id: 3, dx: 0.12, dy: -0.03}
    (id + 位移量,比传完整坐标省很多)

  服务器逻辑帧率:
    30 tick/s(每秒同步 30 次)→ 网络包 33ms 一个
    移动端常用 20-30 tick,兼顾带宽和手感

"同步策略的本质:'少传、勤算、巧渲染'——能本地算的本地算(预测),能少传的少传(增量),能缓存的缓存(插值)。带宽是稀缺资源,游戏优化一半在'省带宽'。"


六、断线重连与防作弊

"联机游戏还有两个绕不开的问题:断线和外挂。"老周说:

断线重连(Reconnect):
  玩家网络波动 → 掉线 → 不能直接判负!
  方案:
    服务器保留对局状态(快照)
    玩家重连 → 下发完整状态 → 恢复画面
    断线期间:英雄由 AI 托管(自动回城/跟随队友)
  超时判定:多久不重连判挂机/判负

防作弊(Anti-cheat):
  状态同步的天然优势:服务器权威
    客户端只能"上报操作",不能"直接改血量"
    → 外挂很难"一刀 999"(服务器不认)
  常见作弊与防御:
    透视/全图 → 战争迷雾由服务器下发,客户端看不到就看不到
    加速 → 服务器校验移动速度是否异常
    自瞄 → 操作合法但精度超常,用行为分析检测
  帧同步的劣势:客户端本地算逻辑 → 容易被改内存作弊
  所以 MOBA 用状态同步的另一大理由是:防作弊

  数据校验:
    服务器验证每个操作的合法性(冷却好了吗?蓝够吗?)
    客户端上报的数值不可信,服务器自己算

"记住:'服务器权威'是网络游戏安全的地基——客户端只是'提款机上的键盘',钱在服务器手里。这也是为什么王者荣耀用服务器同步大部分逻辑(防外挂)。"


七、选型:云间对决用什么方案

云间对决的网络方案(简化版决策):
  ✅ 状态同步(服务器权威)
    - 10 人对局,带宽可接受(位置增量 + 事件同步)
    - 防作弊简单(服务器算伤害)
    - 逻辑好维护(客户端不用保证确定性)
  技术栈:
    - 传输:TCP(可靠)或 UDP+重传(快,游戏专用)
    - 服务器:独立对战服务器(每局一台)
    - 匹配:大厅服务器 + 对战服务器分离
    - 框架:Nakama/Photon(第三方)或自研(高级)

  简化版建议:
    先用 Photon 等成熟框架(省时)
    或本地联机(同一 WiFi 局域网测试)先跑通
    理解原理后,再决定是否自研

"做联机游戏的现实建议:先用成熟方案(Photon/Nakama)把游戏做出来,再考虑自研。 网络同步的坑太深,团队前期别在网络上耗死——'能跑通'比'最优'重要。"


八、章末:老周的第七层总结

第七层:网络同步
├── 核心问题:延迟 → 世界不一致
├── 状态同步:服务器权威(传状态,防作弊好)
├── 帧同步:只传操作(省带宽,要求逻辑确定)
├── 老三样:预测 / 插值 / 延迟补偿(手感来源)
├── 同步分级:高频位置 / 事件 / 低频数值 / 结算
├── 带宽优化:增量同步、二进制协议、20-30 tick
├── 断线重连:状态快照 + AI 托管
├── 防作弊:服务器权威(客户端只是键盘)
└── 选型:状态同步 + 成熟框架起步
下一章预告:
  联网能跑了!但游戏包越来越大(几百 MB 资源),
  手机一进对战就卡(资源加载慢)……
  —— 客户端架构与资源管理:场景管理、资源加载、热更新。

"小陈,两台手机终于'看到同一个世界'了——你放技能,老周那边同步掉血,不瞬移了!"老周看着测试结果,"但王姐又抱怨了:'你们这个游戏包怎么 800MB?手机下载要半天,进对局还要加载半天!'——这就是下一章:客户端架构与资源管理。让游戏'又小又快又能热更新'。"

✌ 语言