网络游戏数据同步的实现 一:状态同步、帧同步的基本原理概述

  • Post author:
  • Post category:其他




什么是游戏的数据同步

数据同步是指使用某种方式让同在一局游戏中的多个客户端保持游戏进程同步。



什么游戏需要数据同步?

  1. 联机游戏(cs、饥荒、dead4ife2等)
  2. 网游(魔兽、天堂、传奇)
  3. 需要快照、快进、回放、观战的游戏(英雄联盟、和平精英等网游)
  4. 实际上带有存档功能的单机游戏,基本使用的都是状态同步原理。



如何判断一个游戏是什么数据同步类型呢

  1. 当你在游戏过程中 断开网络连接,如果游戏人物反复重复断网之前的动作,那毫无疑问就是帧同步。

  2. 如果断网后,人物执行完当前动作就只是在执行默认动作,那这个一定是状态同步。

  3. 如果断网重连时,需要动作预读的,就是帧同步。

  4. 单机游戏,全都是状态同步。

当然还有更明显的区分方法:

传统冒险类网络游戏,几乎都是状态同步。游戏整体逻辑处理由服务器群组成。

竞技类网络游戏,几乎都是帧同步。因为竞技类游戏需要更高速的数据同步。



数据同步的两种方式

比较流行的数据同步方式主要分为以下三种:状态同步、帧同步、混合同步



状态同步

状态同步的流程是,由主机或服务器进行游戏逻辑运算。所有的客户端发送【操作指令】数据到主机或服务端,由主机或服务器处理过逻辑运算后,将场景中相应的物体状态数据,下发到每个客户端,完成同步。

其实在单机游戏中,就已经遍布状态同步的功能实现。单机游戏中的存档功能,就是一种状态的快照保存。

【图】

:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}

客户端 服务器 客户端发送操作指令给服务器 操作指令 服务器收集当前帧中所有客户端发送的操作指令,并在服务器进行游戏逻辑运算,再导出场景中所有对象的状态,广播给所有客户端 当前帧中相关物体的新状态 根据服务器发回的状态信息还原场景 客户端 服务器

【优点】

  1. 由于每一帧的状态都会进行保存,所以可以更方便的切换到指定的帧状态,进行回滚操作
  2. 符合传统互联网的B/C通信逻辑。
  3. 由于逻辑计算都在服务端进行,所以安全性非常高。除非是设计不够完善或是进攻服务器,否则难以被外挂支配。

【缺点】

4. 开发复杂度较大。由于需要匹配对象的所有参数,所以数据规范化十分重要。

5. 由于每个对象都有大量的自有参数,所以传输数据量也非常庞大,相应的也会影响网络流畅度。

6. 涉及到动作动画等操作,需要修改为量化操作。开发比较复杂。

7. 游戏的核心逻辑计算都在服务器运行,所以服务端压力比较大



帧同步

帧同步的流程是,客户端发送操作指令到服务器,服务器负责验证操作和帧序列,然后将在指定帧内发生的用户操作指令发送给所有的客户端,战斗逻辑运算在每个客户端执行。

【图】

:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}

客户端 服务器 客户端发送操作指令给服务器 操作指令 服务器收集当前帧中所有客户端发送的操作指令,验证操作指令和帧的序列号,再将当前帧中所有客户端的操作指令集体打包广播给每个客户端 当前帧中相关物体的新状态 根据服务器发回的操作指令还原场景 客户端 服务器

【优点】

  1. 数据传输量较小
  2. 逻辑计算在客户端执行,服务器压力小

    【缺点】
  3. 由于逻辑在客户端处理,必须保证客户端状态的高度还原。
  4. 由于逻辑端在客户端处理,断线重连时,需要从第一帧开始演算到当前帧,才能同步到当前帧状态
  5. 不能使用自带的物理引擎、浮点数、随机数。否则会导致不同终端设备不能同步还原帧。


混合同步(状态同步 + 帧同步)

这两种方式组合起来就能实现更强大的同步系统

正常同步时使用帧同步,当掉线、存档、回滚、或重播、速播的时候,使用状态同步。



数据同步设计中需要注意的问题

  1. 首先游戏的逻辑处理不能在生命周期函数中
  2. 游戏的主循环需要是帧速可控的。
  3. 为了多端同步,需要使用经过处理的浮点数。与浮点相关的数据类型是:float、double、vector2、vector3、quternion。需要做相应的转换。一般情况下保存快照时浮点数*1000,解析快照时浮点数/1000可用。

    此处是已经实现好的数据实现代码,复制可用
  4. 用查表函数取代三角函数等数学工具函数。
  5. 使用自定义seed随机数,避免误差。
  6. 由于数据传输的速度问题,帧同步的频率不可能太高。所以会导致有卡顿现象,所以需要制作过度帧。过度帧就类似于补间动画。
  7. 如果确定使用animator状态机控制动画,那么不要把重要逻辑与状态机的时间绑定。比如攻击时的碰撞盒开关。、
  8. 如果确定使用animator状态机,不要用同开关的动画剪辑序列。比如组合拳。
  9. 不应在游戏主逻辑循环中使用协程
  10. 不应使用本地差异数据,例如Time、Date等



版权声明:本文为lengyoumo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。