Home 帧同步和状态同步
Post
Cancel

帧同步和状态同步

在多人联机得网络游戏当中,我们需要使用网络同步来保证每一台机器的游戏表现完全一致。例如在英雄联盟当中,我们需要在十位玩家的显示屏上显示相同的英雄位置,技能释放角度,和技能特效。同步机制的最终目的都为为了达到实时的同步不同客户端状态的目的。

同步游戏数据包括但不限于:技能逻辑、普攻、属性、伤害、移动、AI、检测、碰撞等等。

现在网络同步按照大类分有两种做法,帧同步和状态同步。

帧同步 Lockstep

帧同步的运作模式是,游戏的所有逻辑在客户端,客户端按照一定的逻辑帧向服务器上传操作指令,服务器收到操作指令后将其传递给其余的客户端。

注意,如果不是转发操作,而是每一帧进行状态的同步,那么这里也认为是状态同步。

其余的客户端收到指令之后,如果计算的过程一致,接收到的指令一致,那么计算结果肯定是一致的,这样就能保证所有的客户端同步,这就是帧同步的基本运行方式。典型的代表游戏是:王者荣耀,NBAOnline,FIFA

像这样:

但是同样也存在着一些弊端,因为帧同步的战斗逻辑都写在客户端,所以如果修改了客户端的战斗逻辑,就能很轻易的产生加速,透视,自动瞄准等外挂。

同时,由于不同机器的浮点数精度存在着不同,对于某些需要大量计算数据的游戏而言,微小的浮点数差距也会带来截然不同的结果,但我们通常会使用定点数来解决。

还有由于部分客户端网速较差的影响其他客户端游戏体验的问题,但是也有着很多的优化方案,类似于客户端预执行,渲染逻辑分离等

状态同步

状态同步的游戏占主流,但是相对于帧同步而言状态同步开发起来比较的困难。典型的代表游戏:CSGO,守望先锋,LOL,DOTA2

状态模式一般的运作模式是:客户端上传操作到服务器,服务器收到后计算游戏行为的各种数据的结果,然后以广播的方式下方这些计算完成的数据,客户端根据接受到的数据显示画面。

状态同步和帧同步对比

  1. 状态同步和帧同步最典型的区别是把战斗逻辑写在哪,在客户端的话则是帧同步,在服务端的话则是状态同步
  2. 对于FPS之类对于延迟要求较高的游戏而言,基本上使用状态同步,因为帧同步由于其本身的机制,即使优化过后也容易出现卡顿
  3. 帧同步开发难度简单,但是后期问题很难进行排查,状态同步开发较为困难,但问题定位比较容易
  4. 对于游戏性能而言,由于帧同步的客户端需要完整的跑一遍战斗逻辑,开销相互对来说更大
  5. 对于中途加入和短线重连来说,帧同步比较困难,但是状态同步则非常简单,因为在重连时只需要直接创建这些对象,并且同步信息即可
This post is licensed under CC BY 4.0 by the author.

创建一个本地的Ftp服务器

UML图之类图