状态同步

状态同步

  • 服务器每隔100ms 处理一次客户端的输入,并转发状态给其他客户端
  • 客户端预先模拟,而看其他的客户端是过去时100ms之前的状态插值
  • 当产生伤害计算的时候,需要根据时间戳来获取那个时刻的客户端状态,不可超过配置的ms时长(打1s之前的人,对1s之前的人是不是不公平),如果超过则网络误差太大,则判断为失效。
  • 玩家看其他玩家是过去的一个虚影,当玩家和另一个玩家有碰撞阻拦的情况下,是无法拦住过去的虚影的。
  • 击中其他玩家的时候,因为是过去状态的虚影,而通过客户端可以表现动画,但是服务器决定是否命中,当对方玩家延迟和丢包率很高的情况下,只能用很简单的计算方式来算对方的位置,有误差,并不一定准确(服务端)
  • 当网络抖动的情况下,另一个客户端看他其他玩家会出现多次的拉扯。(平滑需要把其他玩家的延迟加大,验证更难了)
  • 如果给当前客户端的网络其他玩家加上输入预测,在丢包率严重的情况下,拉扯会特别大。
  • 服务器验证失败的情况下,需要把客户端归位到服务器的状态。
    • 本地客户端,因为是先模拟的,如果网络延迟很大,本地客户端已经走到8帧,第0帧服务器报告错误,告诉客户端当前0帧错误,归位,客户端需要缓存1~8帧的输入,模拟到当前的状态。
    • 本地客户端的其他网络玩家,其他玩家的数据本身就是服务器转发过来的,所以不会出现模拟错误的情况。
posted @ 2022-12-26 15:51  BackSword  阅读(58)  评论(0编辑  收藏  举报