网络游戏客户端延迟处理

解决游戏的延迟或卡顿,客户端的改进方法有以下几种:

1.客户端插值(解决卡顿):

当客户端A收到服务端发来的玩家B的位置,不是直接瞬移到数据包中指定的位置 ,而是使用插值的方法平滑地插值到新的位置。

此处引入几个概念,插值周期IP和数据包周期PP和RTT。
IP插值周期是从开始插值到插值结束的时间。
PP数据包周期是服务端每个固定时间向前端发送数据,这其中固定时间就是数据包周期,例如服务端每秒向前端发送15次数据,那么数据包周期就是67ms。
RTT是数据包从客户端发往服务端再返回到客户端的总时间。
沉默终端:没有采用插值算法对延迟进行优化的客户端称为沉默终端。

明白了这两个概念后我们来看一下IP和PP两者的关系。
没有插值的沉默终端始终比服务端滞后半个RTT,使用插值算法后客户端比服务端滞后1/2 RTT+IP,
所以为了最小化延迟IP应该尽可能小。考虑到为了避免玩家卡顿,IP应该大于或等于PP(插值结束前收到下一个数据包才不会出现卡顿), 所以IP最好等于PP.

2.客户端预测(解决延迟):

客户端根据收到的以往数据来预测玩家接下来的位置。
当客户端收到一个状态更新,它知道该更新是1/2RTT前的,为了状态更接近服务端,客户端需要运行1/2RTT的模拟。
为了执行1/2RTT的模拟,客户端必须首先能够粗略的估计RTT。计算方法如下:
客户端给服务器发送一个包含基于客户端本地时钟时间戳的数据包。服务端收到这个数据包时,复制时间戳到新的数据包,并发送回客户端,客户端收到该数据包时,根据自己的时钟,从当前的时间中减去旧的时间戳。

3.航位推测法:

假设客户端中的实体继续做当前正在做的事情。
假设RTT为100ms,客户端A收到玩家B当前的位置是(0,0),正以速度1/ms的速度沿着(1,0)方向移动,但是由于有1/2RTT的延迟,所以客户端A显示当前B的位置是(50,0),并预测接当下一个位置更新数据包到来时,位置为(117,0)(此处数据包周期按照67ms算),并向着(117,0)方向移动。
当B一直沿着(1,0)方向移动时不会出错,但是当B的方向改变时,客户端A继续以(1,0)方向预测就会出现错误,如下图,B在134ms时改变了运动方向:
这里写图片描述
当预测值和服务器发来的B玩家数据发生分歧时,有三种方法来弥补:
(1)即时更新状态,立即跳跃到最新位置,但是此时仍然比服务端真实数据慢1/2RTT,客户端需要继续使用航位推测法来模拟额外的1/2RTT.
(2)使用插值法来平滑的更新到最新位置。
(3)二阶状态调整,使用加速度,平滑地对模拟进行同步修正。
游戏基于差异的幅度和游戏特性,将使用这些方法的组合。快节奏的射击游戏通常为小错误使用插值,为大错误使用瞬间移动。慢节奏的游戏,可能使用二阶状态调整处理除了最大错误之外的所有错误。

4.客户端移动预测和重放

以上方法是对于客户端A中玩家B的位置预测(A移动时向服务端发送移动操作,服务端返回位置),对于玩家A本身,客户端不是使用航位推测模拟1/2RTT,而是使用玩家A的精确输入来模拟1/2RTT,每当输入状态到达本地玩家,客户端本地利用这些移动做预测。

猜你喜欢

转载自blog.csdn.net/qq_16209077/article/details/81416297