游戏同步模式

常见的游戏同步方式分为帧同步和状态同步.

帧同步

帧同步是在关键帧的时候同步操作到服务器, 服务器转发操作给客户端. 客户端只有接收到关键帧后才会进行操作. 我们可以把游戏想象是一个状态机, 所有玩家从上一关键帧到这一关键帧的所有操作看作是输入, 逐帧推动着状态的改变.

状态同步

状态同步是客户端上传操作到服务器, 服务器收到游戏行为后进行验算, 然后以广播的形式发放游戏状态, 客户端再根据这个进行显示.

区别

  1. 核心交互逻辑写在哪

    状态同步和帧同步最大区别在于, 核心交互逻辑写在哪里. 帧同步的核心逻辑是写在客户端, 服务器做的仅仅是分发操作. 状态同步下客户端仅仅是用来进行表现的, 逻辑运算是在服务器上的.

  2. 流量

    状态同步的流量消耗要大过帧同步. 因为一个角色自身属性就有可能有上百条, 每次服务器都需要对这些数据进行同步, 并且对于一个操作, 也要分阶段分发状态, 以完成一次操作. 而帧同步只需要对操作进行上传和分发, 甚至可以可以进行状态压缩, 控制发送数据大小.

  3. 回放观战

    对于帧同步, 只需要保存整局玩家的所有操作, 在客户端上重新运行即可. 而状态同步则需要将全局的状态变化都进行保存.

  4. 安全性

    帧同步在安全性上要弱于状态同步. 尤其是RTS中的战略迷雾和FPS中的透视, 是很难加以限制的. 因为客户端需要同步所有玩家的操作, 玩家不能看到其他玩家仅仅在表现层上, 逻辑层上还是能够知道其他玩家的当前状态. 而状态同步所有的逻辑运算都是在服务器上进行, 客户端只是表现接收到的当前状态, 因此一般不存在安全性问题.

  5. 断线重连

    帧同步要实现断线重连比较麻烦, 因为要对所有帧进行缓存, 然后加速运算, 直到追赶到当前帧. 状态同步仅需要分发当前状态, 重新渲染, 或者插值运算即可