以下内容只是在学习和工作中的一些小见解,希望不足之处能得到大家的指正,也希望能对刚刚准备入行游戏的小伙伴有一点帮助。
首先我们默认大家已经了解了网络收发机制,如果有需要,后面再补充。
状态同步:敌不动,我不动
对于状态同步而言,简单的说就是当游戏世界中的玩家没有进行操作或者移动的时候,我们认为游戏世界里大家都没有操作,服务器除了一般的心跳检测之类的,不会对客户端下发任何数据进行同步。
当某个客户端进行了某个操作后,操作发送到服务器,服务器将玩家的操作执行出结果,得出玩家现在的快照(位置、血量、蓝量等等变化的信息),再由服务器将该客户端的信息广播下发到其他的客户端进行同步,当然服务器为了防止作弊也是有做验证机制的。
也就是说状态同步就是将逻辑放在了服务器,而客户端更像一个显示器,游戏世界玩家没有属性变化,基本不会进行同步消息下发。
帧同步:你们和我这样做
帧同步的概念其实更加简单,每个客户端都在执行相同的操作,所以最后的结果一样。
从上面的话中不难猜出,帧同步的逻辑是放在每一个客户端的,客户端将操作发送给服务器,服务器按照固定的时间内收集操作,然后将这个固定时间内收集的所有操作打包再进行转发给每个客户端后再进行下一次收集,所有客户端再通过服务器下发的操作执行逻辑,就是最初级的帧同步概念,当然服务器也可以执行逻辑进行验证操作防止作弊。
我们所谓的帧理解为一次逻辑的更新时间,就有点类似FixedTime一样,是一个固定的时间。
举个栗子:某者某耀Moba类型游戏,就是15帧的刷新率,也就是它将1秒分成了15次的逻辑更新,你所看见的60-90多帧只是表现帧数,表现帧数越高越丝滑。
还有就是需要使用定点数,当你的逻辑中使用了浮点数的时候,因为每一台机器的不同,浮点最后的有效值其实是不一样的,所以为了保证逻辑的同步性,再游戏逻辑中,需要使用定点数。
大多数帧同步的逻辑是只放在每个客户端的,无论是否有操作,每一帧都会有服务器数据下发。
状态帧同步:每时每刻知道你在哪儿
状态帧同步就是状态同步和帧同步的概念相结合。客户端向服务器上传操作,服务器跑逻辑,但是又在按照固定的每一帧下发所有玩家的状态(属性位置等)给每一个客户端实现同步。
这里最具典型的就是守望先锋就是采用的状态帧同步的概念。在这个概念中,服务器和客户端都是有一套相同的代码的,但是客户端的逻辑代码更偏向于用来做预测行为,客户端可以预测主玩家的行为,让主玩家不需要等待服务器的快照就能直接执行玩家按下的操作,这样就能增加玩家的体验,而当服务器下发快照的时候,玩家再去验证自己的预测是否正确,不正确的就对操作进行回滚。
每种同步方式都有自己的优劣,没有最好的同步方式,只有最合适的。在互联网高速发展的当下,我相信在不久的将来,或许会有很多新的同步解决方案等待大家的挖掘。