网络游戏的移动同步(五)帧同步算法

发了部分移动同步类的文章后,有一些朋友加了我的联系方式,也进行了一些探讨,在这中间,有个朋友跟我聊了另外一种同步方式,即这种帧锁定的变种算法,帧同步算法,基本是思路是这样的。

算法流程

1.服务器同步随机种子,初始帧索引等会造成每个客户端运算不一致的初始数据;

2.客户端发送指令,比如(选中,移动,攻击目标等),指令包含当前帧索引;

3.服务器每隔一段时间(假设是100ms)发送帧更新包,该更新包将客户端逻辑心跳步进,并且处理当前帧索引的指令,当前帧索引步进1;

这里有一些术语需要解释,比如逻辑心跳,大抵的意思就是,比如移动,攻击等比较高层的逻辑行为,而譬如动画等行为不属于逻辑行为。

也就是在这种情况下,因为所有指令都是等到服务器发送的帧更新包才进行处理,所以所有客户端处理的时间线是完全一致的,虽然服务端到每个客户端的时间不一致,但是并不会出现帧卡住的现象,因为哪怕某个客户端没收到更新包,他所看到的屏幕也仅仅是玩家,怪物不移动,而非锁帧。

另外这种处理方式也解决了另外一个问题,就是延迟以最高延迟的客户端为主,这种情况下,服务器是不等待所有客户端的控制指令到达的,到达时间就发送帧步进。

另外,初始我对该同步方式的担忧是担心流量太大,但是仔细考虑了一下,由于发送的协议仅仅是指令,结果的处理完全由客户端模拟,所以少了需要状态同步的协议,而这些状态同步的协议往往非常大,因此这种方式可能整体流量还会少许多。

参考文献

  1. 帧同步在竞技类网络游戏中的应用
  2. 网络层+架构层 : 自研游戏帧同步方案
  3. 「译」Unity3D中实现帧同步 – Part 1
updatedupdated2021-01-202021-01-20