1. 定点数(操作系统级):小数点位置不变,通常为纯整数或纯小数
  2. 浮点数(操作系统级):额外使用尾数和阶码表示的一种小数点位置可变的数据
  3. IEEE754:1985年脱胎于Intel8087芯片的一种通用的浮点数表示标准,浮点数有IEEE754标准实现,但各种编程语言,编译器,CPU指令集在浮点运算舍入实现上各不相同,有一种帧同步服务器只负责转发玩家操作指令,为了保证客户端表现的一致性,定点数应运而生。
  4. 定点数(应用级):使用确定精度的整型或者长整型实现浮点精度的一种数据结构,由于是应用级的实现,所以在任意编程语言,编译器,CPU指令集上计算结果都一致
  5. 状态同步:只在状态数据(属性、buff、释放技能等)发生改变时同步数据,没有逻辑帧的概念,当然底层仍然有一个Tick计时器,但是只有deltaTime,没有帧号的信息。
  6. 帧同步:有明确的逻辑帧概念,按固定的逻辑帧(固定时间间隔)同步数据,比如以30FPS作为逻辑帧进行同步和Tick,那么每秒就有30次同步和Tick行为,是否使用定点数(确保结果一致性),是否客户端计算服务端校验等,和网络同步方案的定义没有关系。
  7. 状态帧同步:有固定的逻辑帧来搜集变化的状态数据并进行数据同步,服务器按帧为单位来收集变化了的状态数据,然后打包给客户端。
  8. 一些例子:
    1. 帧同步:某ACT游戏,为了及时响应的打击感在客户端使用定点数,并且按照逻辑帧驱动游戏运行,服务端只同步玩家输入指令
    2. 状态同步:某MMORPG游戏,为了增加同屏人数,使用了服务端运行全量逻辑方案+ AOI同步优化,并且只同步玩家释放技能指令,血量改变,蓝量改变等状态数据来优化带宽占用
    3. 帧同步:某MOBA游戏,为了应对恶劣的网络环境与优化带宽,使用了自定义可靠UDP方案,按帧同步数据,并在本地使用定点数,服务器运行全量战斗逻辑用于判决玩家是否存在作弊行为
    4. 状态帧同步:某FPS游戏,本地与服务器同时跑全量战斗逻辑,本地可先行于服务器做预测,并且按逻辑帧来搜集同步每一帧发生变化的状态数据,当客户端发现自己与服务端状态不一致时进行回滚
  9. 状态同步与帧同步的特征:
    1. 是否在客户端接受指令进行模拟计算不能断定是否为帧同步,因为状态同步一样可以为了” 快速响应“而在客户端进行模拟计算
    2. 是否使用定点数并不能断定是否为帧同步,因为状态同步一样可以为了及时响应和低概率回滚行为而在本地使用定点数跑逻辑
    3. 是否在服务端跑全量逻辑不能断定是否为状态同步,因为帧同步同样可以在服务器跑全量逻辑来验证玩家的作弊情况
    4. 由于愈发复杂的战斗逻辑与需求,当今常用的网络同步方案并不是非此即彼的,即更像状态帧同步,比如一个状态同步的MMO任务移动模块,会以比Tick频率更低的频率来同步带帧号的位置信息,然后客户端对结果进行差值来得到一个比较顺滑的表现。
  10. 断线重连与录像回放系统:
    1. 不论是状态同步,帧同步还是状态帧同步都可以实现断线重连和录像回放系统,只是方式和成本差异较大
    2. 状态同步:
      1. 固定时间间隔(其实这里就引入了逻辑帧概念,可能是30FPS或者15FPS)存储世界快照
      2. 对于断线重连如果是大退(崩溃、用户强行退出),服务器直接下发当前帧全量世界快照,十分迅速
      3. 如果是短时间断线,服务器则下发最近一段时间(比如80帧到90帧)的世界变化的非全量快照
      4. 对于录像回放,服务器需要打包收集这一场战斗每一帧的全量世界快照和变化快照,全量世界快照用于定位任意帧的战场情况,客户端本地进行模拟即可得到正确表现
    3. 帧同步:
      1. 对于断线重连,在客户端本地使用了定点数的情况下。
        1. 对于大退重连就需要服务端发送0~当前帧的玩家指令,客户端从第0帧进行模拟到当前帧
        2. 如果是小退就发送上一个合法帧到重连帧所有玩家指令。
      2. 对于录像回放,服务端同样只需要打包所有玩家输入的帧指令进行下发,客户端本地进行模拟即可得到正确表现。
      3. 因为帧同步只保存每一帧的帧指令因此帧同步不好支持可以拖动进度的录像模块,因为需要额外的世界快照信息,或者每次拖动都从第0帧模拟到当前帧。
    4. 状态帧同步:同状态同步的处理方案
  11. 网络同步方案在游戏类型的适用性:
    1. 几乎只能状态同步的游戏:MMO
    2. 几乎只能帧同步的游戏:RTS
    3. 状态帧同步适合的游戏:除了RTS、MMO这种只适合帧同步或者状态同步的游戏,有较强的兼容性

https://www.bilibili.com/video/BV1RR4y1V7T2