状态同步和帧同步我的理解

1、同步安全

所谓同步,就是要多个客户端表现效果是一致的,例如咱们玩王者荣耀的时候,须要十个玩家的屏幕显示的英雄位置彻底相同、技能释放角度、释放时间彻底相同,这个就是同步。就好像不少我的一块儿跳街舞齐舞,每一个人的动做都要保持一致。而对于大多数游戏,不只客户端的表现要一致,并且须要客户端和服务端的数据是一致的。因此,同步是一个网络游戏概念,只有网络游戏才须要同步,而单机游戏是不须要同步的。服务器

 

2、状态同步和帧同步的区别网络

最大的区别就是战斗核心逻辑写在哪,状态同步的战斗逻辑在服务端,帧同步的战斗逻辑在客户端。战斗逻辑是包括技能逻辑、普攻、属性、伤害、移动、AI、检测、碰撞等等的一系列内容,这经常也被视为游戏开发过程当中最难的部分。因为核心逻辑必须知道一个场景中的全部实体状况,因此MMO游戏(例如魔兽世界)就必须把战斗逻辑写在服务端,因此MMO游戏必须是状态同步的,由于MMO游戏的客户端承载有限,并不能把整张地图的实体所有展示出来(例如100米之外的NPC和玩家就不显示了),因此客户端没有足够的信息计算全图的人的全部行为。orm

具体到客户端和服务端通讯上,在状态同步下,客户端更像是一个服务端数据的表现层,举个例子,一个英雄的几乎全部属性(例如血量、攻击、防护、攻速、魔法值等等)都是服务端传给客户端的,并且在属性发生改变的时候,服务端须要实时告诉客户端哪些属性改变了,客户端并不能改变这些属性,而是服务端传来多少属性就显示多少属性(虽然能够改变客户端数值达到表现上的效果,例如无限血量,可是服务端那边的血量属性为0时,同样要死)。再举个例子,一个英雄要释放一个非指向性技能(例如伊泽瑞尔的Q),具体的过程就是,客户端通知服务端“我要释放一个技能”-》服务端通知客户端“在某地以什么方向释放某技能”-》客户端根据这些信息建立一个特效放在某地,而后以某个方向飞行-》服务端根据碰撞检测逻辑判断到某个时刻,这个技能碰到了敌方英雄,通知客户端-》客户端根据服务端信息,删除特效,被打的英雄减血同时播放受击特效。blog

而在帧同步下,通讯就比较简单了,服务端只转发操做,不作任何逻辑处理。如下图为例:接口

如今同一局里有4个玩家,也就是4个客户端,这时客户端A释放了一个技能x,此时将操做传递给服务端,服务端不作任何判断,直接把A的操做所有分发给ABCD,则ABCD同时让客户端A控制的英雄释放技能x。游戏

 

3、流量服务器开发

状态同步比帧同步流量消耗大,例如一个复杂游戏的英雄属性可能有100多条,每次改变都要同步一次属性,这个消耗是巨大的,而帧同步不须要同步属性;例如释放一个技能,服务端须要通知客户端不少条消息(必须是分步的,否则功能作不了),而帧同步就只须要转发一次操做就好了。游戏开发

 

4、回放&观战开发

帧同步的回放&观战比状态同步好作得多,由于只须要保存每局全部人的操做就行了,而状态同步的回放&观战,须要有一个回放&观战服务器,当一局战斗打响,战斗服务器在给客户端发送消息的同时,还须要把这些消息发给放&观战服务器,回放&观战服务器作储存,若是有其余客户端请求回放或者观战,则回放&观战服务器把储存起来的消息按时间发给客户端。

 

5、安全性

状态同步的安全性比帧同步高不少,由于状态同步的全部逻辑和数值都是在服务端的,若是想做弊,就必须攻击服务器,而攻击服务器的难度比更改本身客户端数据的难度高得多,并且更容易被追踪,被追踪到了还会有极高的法律风险。而帧同步由于全部数据所有在客户端,因此解析客户端的数据以后,就能够轻松达到本身想要的效果,例如moba类游戏的全图挂,吃鸡游戏的透视挂,都是没办法防止的,而更改数据达到胜利的做弊方式(例如更改本身的英雄攻击力)能够经过服务器比对同局其余人的战斗结果来预防。

 

6、服务器压力

状态同步服务器压力比较大,由于要作更多运算。

 

7、开发效率

首先要说,状态同步的游戏占主流,其次就是状态同步开发起来比较难。而帧同步服务器开发难度低,同一套方案能够给不少不一样类型的游戏使用,反正都是转发操做;减小了服务端客户端沟通,老实说,没有扯皮的时间,开发效率最起码提升20%,状态同步的方案下,同一个功能至少须要一个客户端和服务端共同完成;PVP和PVE基本用的是同一套代码,作完PVP很容易就能够作单机的PVE。

 

8、使用帧同步的知名游戏

王者荣耀、魔兽争霸三、全部格斗类游戏

 

9、断线重连

状态同步的断线重连很好作,无非就是把整个场景和人物所有从新生成一遍,各类数值根据服务端提供加到人物身上而已。帧同步的断线重连就比较麻烦了,例如客户端在战场开始的第10秒短线了,第15秒连回来了,就须要服务端把第10秒到第15秒之间5秒内的全部消息一次性发给客户端,而后客户端加速整个游戏的核心逻辑运行速度(例如加速成10倍),直到追上现有进度。

 

 

10、注意点

须要保证每次随机的数字都相同,因此须要本身实现一套随机数,不能用unity自带的那个随机数接口,并且须要服务端发送相同的随机种子;由于很是微小的偏差就有可能产生蝴蝶效应,因此全部float型的参数必须变成int型,保证计算结果一致。

相关文章
相关标签/搜索