游戏帧同步

主要记录一下之前做帧同步游戏的一些心得和预想

一部分借鉴了这里的处理 帧同步联机战斗(预测,快照,回滚)

1.浮点数处理

浮点数转定点数

由于传统浮点数的计算在不同机型上会有不同的计算结果,并且随着时间的积累误差会越来越大。因此需要一个方案去解决这些问题。

  1. 浮点数全部用整数处理:简易的同步结果方案,缺点是有可能越界。(例如一个int和一个float做乘法,如果原数值就要*1000,那最后算出来的数值,可能会非常大,有越界的风险)
    2)定点数方案:小数点固定的数,例如一个16位的定点数,前八位处理整形数据,后八位处理小数。

其它的定点数相关

  1. 物理系统处理:需要有一套定点数实现的物理系统
  2. 代码执行顺序(统一的SyncUpdate)
  3. 随机数处理:前后端同步随机种子(需要生成一套比较真实且高效的随机算法,现有比较流行的是线性同余伪随机数。之前想过自己随便写一个伪随机数,细想一下没有办法保证均匀分布哈哈)
  4. coroutine执行的顺序不确定性,hash容器的排序不固定性
  5. 用到的插件的定点数处理
  6. 大概这些吧,其它的不知道了

2.协议相关

  1. kcp:可靠
  2. udp:快速
  3. kcp:快速可靠(以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度)

3.逻辑与渲染分离

1) 数据推算单独走一套逻辑,显示走一套逻辑
2) 客户端帧指令带入时间戳,根据延迟统计计算帧指令

4.数据校验

1) 多客户端校验(3个及以上):多数对比原则,超过半数的数据一致时数据比较可靠
2) 少数客户端校验(2个及一下):结合辅助布局在服务器的终端进行辅助校验,相对成本会高一点
3) 纯服务端校验:服务端也跑一遍客户端的逻辑进行校验

5.帧指令

除去协议好,帧指令可包括帧号,子指令数组,客户端时间戳,服务器时间戳(根据延时数据做出对应的预测方案)

6.内存快照

为了应对断线重连以及中途玩家加入引入的数据。可固定时间重置一次内存状态信息(位置,动作,技能,碰撞等信息)

7.快速演算

1)加上内存快照快速演算
2) 从头开始加速演算
3) 静默演算(后台默默计算数据,前台静默)

8.过程数据校验

在过程中提交结果关键数据,用于校验最终结果是否合法

9.数据预测和回滚

  1. 客户端先行:为了提升操作手感,玩家(自己)操作的角色可提前行动。逻辑角色跟随服务器帧指令移动
    2) 位置预测,预测错误则要根据最近的内存快照快速演算追上
    3) 对于网络好的玩家减少预测,网络差的玩家增加预测
    4) 动作预测? 特殊形况下的动作预测
    5) 客户端命中服务器未命中的命中逻辑优化(服务器慢于客户端造成的信息差处理,射击类游戏必做)

10.帧同步指令帧合成图:

帧同步指令帧合成图

猜你喜欢

转载自blog.csdn.net/qq_28976599/article/details/124848521