i007.cc

i007.cc

优先队列-降维打击

05.价值资料

讲讲游戏里面的帧同步 vs 状态同步的区别,和各自的应用场景

这两种方案是游戏网络同步的两条根本不同的路,理解清楚对你 EA 面试非常有价值,因为 FC Mobile 这类实时体育游戏的同步选型是一个很典型的话题。


帧同步(Lockstep)

核心思想:同步输入,各自演算

服务器或 P2P 网络只传输每帧的玩家操作指令,每个客户端在本地运行完全相同的游戏逻辑,只要输入一样,结果就必须一样。

客户端 A: 第5帧 → 操作:向左移动
客户端 B: 第5帧 → 操作:攻击
          ↓ 双方都收到彼此的指令
客户端 A 本地模拟:A向左 + B攻击 → 结果
客户端 B 本地模拟:A向左 + B攻击 → 结果(必须与A完全一致)

 

帧同步对**确定性(determinism)**的要求极其苛刻:

  • 浮点运算必须在所有平台上结果完全一致(通常用定点数替代 float)
  • 随机数必须用相同种子的伪随机数生成器
  • 物理引擎不能用任何不确定的优化
  • 容器遍历顺序必须一致(不能用 unordered_map

优点:

带宽极低,只传指令。1000 个单位在移动,网络包里只有两行输入,不是 1000 个坐标。天然支持完美回放(保存所有帧的输入就等于保存了整局游戏)。校验也简单,每隔若干帧对比各客户端的游戏状态哈希值,不一致就是 desync。

缺点:

最致命的问题是木桶效应——所有客户端必须等最慢的那个人确认收到输入才能推进下一帧(或者用预测帧 + 回滚来缓解)。一个人网络抖了,所有人都卡。另外 desync 一旦发生就是全局不一致,排查极其困难。


状态同步(State Sync)

核心思想:服务器权威,下发状态

服务器是唯一的”真相”,它维护完整游戏状态,定期把关键状态广播给所有客户端,客户端负责渲染。

客户端 A: 按下移动键 → 发送给服务器
服务器: 处理逻辑 → 计算新位置 → 广播给所有客户端
客户端 A/B/C: 收到新状态 → 渲染

 

状态同步的核心挑战不是同步本身,而是如何让玩家感觉不到延迟。由此衍生出三个关键技术:

客户端预测(Client-Side Prediction):客户端不等服务器确认,立刻在本地执行自己的操作并渲染结果。服务器的权威结果回来后再做校正(reconciliation)。自己的角色不会感觉到延迟。

插值(Interpolation):其他玩家的位置,客户端在收到的两个状态帧之间做插值平滑,避免其他角色”跳帧”。代价是其他玩家看起来总是落后 1-2 个状态帧。

延迟补偿(Lag Compensation):FPS 里的典型问题——玩家在本地看到敌人在某个位置开枪,但服务器那边敌人已经移走了。服务器在处理开枪请求时,把游戏时钟”回拨”到玩家开枪时刻来判断是否命中。


两者的本质差异对比

帧同步 状态同步
传输内容 玩家输入 游戏状态(坐标、属性等)
逻辑运行位置 每个客户端 服务器(权威)
带宽消耗 极低 与同步对象数量正相关
延迟影响 所有人受最慢玩家拖累 各玩家延迟相互独立
断线重连 困难(需重放所有历史帧) 容易(直接下发当前状态)
反作弊 哈希对比状态,逻辑在客户端 服务器权威,易于反作弊
确定性要求 极严苛 无要求
回放实现 极简单(保存输入流) 较复杂(需录制状态流)

各自的典型应用场景

帧同步适合:

  • RTS(星际争霸、魔兽争霸、帝国时代):单位数量可能成百上千,状态同步带宽不可承受,帧同步只传指令完美解决。
  • 格斗游戏(街霸、铁拳):双人对战,帧数据极少,对确定性要求高,帧同步配合 GGPO 回滚网络代码是行业标准。
  • 早期 MOBA 手游(王者荣耀早期版本):手机流量宝贵,帧同步带宽优势明显。

状态同步适合:

  • FPS(CS、COD、Valorant):射击判定必须服务器权威,延迟补偿 + 客户端预测是标配。
  • MMO:玩家数量巨大,且不同玩家关注不同区域,按需同步(AOI,Area of Interest)是关键,状态同步更灵活。
  • 体育手游(FC Mobile 这类):移动网络波动大,每个玩家的延迟体验需要独立保障,服务器权威保证公平性,客户端预测保证手感。

One thought on “讲讲游戏里面的帧同步 vs 状态同步的区别,和各自的应用场景

  • WillPost author

    体育手游用状态同步的原因补充:
    1. 体育手游的参与人数或者场上角色数量不是太多,状态同步所担心的流量压力不算大。
    2. 状态同步可以中场加入,方便断线重连

发表回复