【网络游戏同步理论】学习记录(一)(Lockstep、状态同步、延迟补偿)

学习原文:《网络同步在游戏历史中的发展变化》作者: Jerish

网络同步 = 实时多端数据同步 + 实时多端表现同步

Lockstep锁步同步

  • 帧同步 是包含各种变形算法的Lockstep。严格来讲就是Deterministic Lockstep。
  • 知乎韦易笑大佬文章上也有,我这里就记录几个重点的概念。方便理解同步问题。
  1. 帧同步 范指保证每帧(逻辑帧)输入一致。
  2. 状态同步 客户端表现不同,但内在状态一致。
  3. 最后上面2种同步都是范指,不能将帧同步,Lockstep划等号

早期Loclstep

  • FPS游戏Doom,客户端运行一个系统,这个系统每0.02s对玩家键盘按键鼠标等进行采样得到一个Tick Command发送给其他玩家,其他玩家接收到Tick Command进行缓存,当得到所有的Tick Command将会推进到下一帧。

Bucket Synchronization

  1. 首先是把时间线按间隔划分出一个一个的Bucket,所有想命令将会在Bucket中执行,玩家的本地命令将不会立即执行而是延迟一个delay synchronization time(一般为网络延迟)用来等待其他玩家的的Bucket到来。怎么理解?我找了个比较容易理解图,原文解释
  2. 首先先别看图中乱七八糟的东西,T1时间A发送攻击C指令,由于网络延迟T2时间,B未收到指令,B也发送攻击C指令,所以在A的世界中C是被自己杀死的,B打空了。而在B的世界中C是被自己杀死的,A打空了。
  3. 下面来看下图,ABCDE都是Bucket间隔为50ms,delay synchronization time = 100ms,T1时刻A发送攻击C指令然后延期到了Bucket C。T2时刻B也发送攻击C指令被延期到Bucket D。然后T3时刻B接收到了A发过来的攻击指令放入Bucket C中,然后执行Bucket C。T4时刻A客户端接收到B发送的攻击指令放到Bucket D。最后执行Bucket D。这样可以发现C被A正确的杀死了,而B打空了,此时AB客户端都是一样的了。

锁步同步协议 Lockstep protocol

  1. P2P架构中外挂lookahead cheats 通过推迟发送自己的操作,来达到先看到对手决策
  2. Lockstep protocol分两步。1、先对明文进行加密,生成预提交hash值。 2、等到本地客户端收到了所有客户端发送的的hash值,然后再发送自己的明文消息。3、本地客户端收到所有明文后,逐个明文hash和预提交的hash对比,如果不同将认为是作弊。
  3. 缺点 发两次带宽肯定消耗大,而且可以看到是接收到所有客户端发送,那么有一个客户端网贼拉胯,那么…自己想

Lockstep小结

  • 保证多台机器游戏表现相同,因为各方面原因,需要在一回合(Trun)内保持一致,如果有某个玩家因为某些原因没有同步推进,那么我们就需要等他。上个图好了

状态同步

快照
  • 客户端是纯粹的渲染器,服务器每帧接收客户端的输入,来计算整个世界的状态。缺点就是对于网络不好的玩家,画面还没渲染出来就给人打死了。并且这样发送快照占用带宽是非常庞大的,星际围城:部落 中为了降低网络带宽,采用只发送变化的数据(增量快照同步)。
客户端预测和回滚
  • 这个在网络游戏实战好像提过一嘴,在服务端确实输入和更新游戏状态前,就是客户端立即响应玩家本地的操作。如果预测响应的结果与服务端的结果相同当然是有效的,如果不相同那么将会有以下2种情况。
  1. 例如10ms和50ms分别发送了位置信息,在50ms发送完成,客户端会立即响应这个消息,预测更新本地位置坐标,然后你接收到了10ms发送来的消息,你说你要不要纠正成10ms的位置信息吗?所以需要加上时间戳来让客户端知道消息是否过时。
  2. 客户端维护一个MoveBuffer,里面放着客户端预测的指令和时间戳。如果收到了服务端的确认。那么就会清空MoveBuffer如果和不服务的不一致,这时将会以服务器的正确的位置,然后重新执行一遍MoveBuffer存储的指令。如下图示例。

    上面是书上的图,乍一看还挺懵,我画张图,解释一下,F就是向前移动1个单位,R向右移动1个单位。
插值技术
  • 内插法 根据一直离散点在一定时间内,按一定的算法模拟点间的移动路径
  • 外插法 利用现有的位置和速度推测未来位置的技术。外插注重推测
  • 插值技术的目的 就是在收到同步数据前,让本地角色有更加平滑的表现。
延迟补偿
  • 由来:<<半条命>>中除了客户端预测,客户端服务端执行同一套代码,还存在一个问题网络延迟。玩家开枪到达服务器执行一定会延迟。所以提出了延迟补偿。
  • 概念 服务器在指定时刻对玩家进行回滚并计算。
  • 怎么理解 假如客户端端到服务器的延迟为10ms,服务端定时记录客户端的位置,在玩家开枪后经过10ms到达服务器,服务器将会回滚到10ms以前的位置,然后计算是否命中玩家,计算完然后再复原位置。
  • 存在的问题 下面图就是对于ACT(动作游戏,个人理解就拳皇这类)。客户端A和B分别发出后撤与攻击指令。A的延迟低先到达服务器,B的延迟高后到达服务器,这时服务器回滚A的位置,然后判断攻击上了。这样对待玩家A很不公平。但是对于FPS这类游戏,你根本不知道对手到底瞄准到你没,所以没太大的影响。

这本书内容有点多分个P吧,我以为能一次写完呢。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值