两种同步模式:帧同步和状态同步

Posted 头号理想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两种同步模式:帧同步和状态同步相关的知识,希望对你有一定的参考价值。

同步

所谓同步就是要一个游戏中的所有客户端的表现效果是一致的
就拿王者荣耀来说 十个玩家所有数据都是同步的,比如位置 技能cd 技能角度 单个英雄状态等 这个就是同步
同步是一个网络游戏的概念,单机游戏是没有同步的概念的

状态同步

原理

状态同步的战斗逻辑写在服务器端,包括技能释放,普攻,伤害,移动等等一系列内容
由于核心逻辑必须知道一个场景中的所有实体的情况,所以就必须把战斗逻辑写在服务器端
比如魔兽争霸的客户端承载有限,并不能把所有的地图的实体展现出来,所以客户端没有足够的信息计算全图的内容、

状态同步之下,客户端向是一个个服务器端数据的表现层
就拿一个英雄来说它所有的属性(血量,物理攻击,魔法攻击,物抗,魔抗等等)都是服务器端传输给客户端的
而且在属性发生改变的时候,服务器需要实时通知客户端发生了哪些改变,
客户端不能改变这些属性 他只是将服务器端传输过来的数据显示出来

再举个例子
假如说王者荣耀里边后移释放大招,这时候客户端通知服务端:我要释放大招
服务器通知客户端:在什么位置释放什么方向释放的信息
客户端通过这些信息创建一个特效在某地 然后向这个方向 飞行
然后服务端根据碰撞等逻辑判断 如果击中可击中的物体 产生相应的效果

帧同步

原理

帧同步下比较简单,服务端只负责转发,不做任何逻辑处理
假如在王者荣耀中一个英雄释放技能 他将会通知服务端 然后服务端通知其他客户端
实现同步的功能

比较著名的就是王者荣耀

流量消耗

状态同步比帧同步消耗大
在一个复杂的游戏中 在拿王者荣耀来说 所有属性 每个英雄独特的buff 其他英雄的debuff加起来可能好多好多属性
每次改变都要同步一次属性,那样的话消耗是巨大的
帧同步不需要同步属性 只需转发一次操作 所以状态同步的消耗是大于帧同步的
同理:状态同步的服务器压力比较大 因为要做更多的运算

战斗回放&观战模式

王者荣耀中有保存战斗回放和观战的机制
对于这两个状态同步比较好做
因为只需要保存这场战斗中所有人的操作即可
我们实现一个回放&观战服务器,战斗一旦开始,战斗服务器就给客户端发消息的同时
把这些消息传递给回放&观战服务器 如果有其他客户端请求观战或者回放,将回放&观战服务器上的数据按时间传递过去给客户端即可

安全性

状态同步的安全性比帧同步的安全性要高很多
因为状态同步的所有逻辑和数值都是在服务器端的,
如果想要作弊,就需要攻击服务器 但是攻击服务器的难度比客户端要高很多很多 而且容易被追踪

而帧同步所有数据都在客户端,所以解析客户端的数据就很容易达到自己想要的效果

开发效率

状态同步的游戏占主流,同时状态同步的游戏开发难度要高于帧同步
同一套方案可以给很多不同类型的游戏使用,都是转发操作(减少了服务端和客户端之间的沟通)

断线重连

状态同步的断线和好做,因为就是把整个场景和角色重新生成一次,各种数值根据服务端传给客户端即可
但是帧同步断线重连就比较麻烦,因为中间可能产生时间差 这可能造成游戏逻辑运行速度加速(追上现在进度)
这也就是王者荣耀中断线重连之后 游戏速度加快很多的原因

以上就是关于帧同步和状态同步的知识
希望对大家有所帮助

参考知乎大佬的文章 附上链接https://zhuanlan.zhihu.com/p/36884005

防外挂

上边简单说了一下服务器的防攻击机制高于客户端 所以状态同步的攻击难度高于帧同步
但是也不至于为了更难攻击 我们专门去使用状态同步去开发
所以就需要对帧同步进行放外挂(破解)机制
1.因为每个玩家都有独立的完整的运算逻辑,所以玩家之间可以进行互相校验(三人以上)以实现查出外挂玩家所在
2.添加一个空白客户端 只用于校验其他玩家(3人一下适用)
3.服务器辅助验证

以上是关于两种同步模式:帧同步和状态同步的主要内容,如果未能解决你的问题,请参考以下文章

两种同步模式:状态同步和帧同步

服务器解决了什么问题状态同步和帧同步

服务器解决了什么问题状态同步和帧同步

从《王者荣耀》谈游戏的帧同步

在《王者荣耀》来聊聊游戏的帧同步

网络游戏研发,该选帧同步还是状态同步?对比之后你就懂了