帧同步和状态同步
笔者意在通过此篇文章彻底理清和强化游戏同步概念
1:同步:所谓同步,就是要多个客户端表现效果是一致的,例如我们玩王者荣耀的时候,需要十个玩家的屏幕显示的英雄位置完全相同,技能释放角度,施放时间完全相同,这个就是同步,对于大多数游戏,不仅客户端的表现要一致,而且需要客户端和服务端的数据是一致的,所以,同步是一个网络游戏概念,只有网络游戏才需要同步,而单机游戏是不需要同步的。
2:帧同步和状态同步的区别:
最大的区别就是战斗逻辑写在哪里,状态同步的战斗逻辑写在服务端,帧同步的战斗逻辑在客户端,战斗逻辑是包括技能逻辑,普攻,属性,伤害,移动,AI,检测,碰撞等等一系列内容,这常常也被视为游戏开发过程中最难的一部分,由于核心逻辑必须知道一个场景中的所有实体状况,所以MMO游戏(典型的魔兽世界)就必须把战斗逻辑写在服务端,所以MMO游戏都是状态同步的,因为MMO游戏的客户端承载有限,并不能把整张地图的实体全部展现出来(100外的NPC和玩家就不再显示),所以客户端没有足够的信息计算全图的人的所有行为
状态同步:
顾名思义,同步的就是游戏中的各种状态,这里需要区分一些逻辑层和表现层,这里的状态指的就是表现层,状态同步指的是将其他玩家的状态行为同步的方式,一般情况下,AI逻辑,技能逻辑,战斗计算都由服务器运算,只是将运算的结果同步给客户端,客户端只需要接受服务器传过来的状态变化,然后更新自己的本地动作状态,BUFF状态,位置等就可以了,因此,根据定义,严格的状态同步,客户端不不进行任何逻辑运算的,但是为了给玩家更好的体验,减少同步的数据量,客户端也会做很多的本地运算,减少服务器同步的频率以及数据量
实现状态同步的一般流程是:
客户端上传操作到服务器--》服务器收到后计算游戏行为的结果,然后以广播的方式下发游戏中各种状态--》客户端收到状态后再根据状态显示内容
很明显,由于战斗逻辑在服务端,服务器的压力自然增加,随着客户端发送操作消息的频率增加,服务器响应的速度也会降低,进而导致不同玩家的屏幕上同一时间显示的内容可能不相同,但是会保证最后操作产生的结果相同, 为此,状态同步的游戏大多数情况下要求高延迟下对游戏性影响不大的游戏,最典型的就是回合制游戏
帧同步:
RTS游戏常采用的一种同步技术(RTS:即时战略游戏,代表作魔兽争霸,星际争霸)。上一种状态同步方式数据量会随着需要同步的单位数量增长,对于RTS游戏来讲动不动就是几百个单位可以被操作,如果这些都需要同步的话,数据量是不能被接受的(每次同步服务器都得跑一遍战斗逻辑下发状态,延迟会非常巨大,对于RTS游戏来说是致命的),所以解决思路就是要缓解服务器压力,将服务器的战斗逻辑转移到各个客户端进行计算,那么如何保证每个客户端的自行运算的结果一致和将各个客户端结果都同步呢?所以还需要客户端上发消息,这个消息携带的就是玩家的操作指令,所以帧同步出现了,帧同步不同步状态,只同步玩家的操作指令,操作指令包含当前的帧索引,一般流程是客户端上传操作到服务器,服务器收到后并不计算游戏行为,而是转发到所有客户端,客户端接收到操作以后,通过运算可以达到一致的状态,这样就算单位再多,他的同步量也不会再增加(因为服务器不再进行运算,只负责消息的接收,转发)
实现帧同步的一般流程是:
同步随机数种子(一般游戏中都设计随机数的使用,通过同步随机数种子,可以保证随机的一致性)--》客户端上传操作指令(指令包括游戏操作和当前帧索引)--》服务器广播所有客户端的操作,(如果没有操作,也要广播空指令来驱动游戏帧前进)
帧同步的特性导致客户端的逻辑实现和表现必须完全分离,Unity中的一些方法接口(如Invoke,Update,动画系统等)是不可靠的(无法严格的控制不同客户端的游戏帧)所以需要自己实现一套物理逻辑,数学库,做到逻辑和表现分离
由于帧同步的特性,很容易就能做出观感很好的战斗回放,服务器记录所有操作,客户端请求到操作文件再执行一次即可。

浙公网安备 33010602011771号