帧同步和状态同步

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

https://zhuanlan.zhihu.com/p/36884005?utm_medium=social&utm_source=qq

 

一、同步

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

 

二、状态同步和帧同步的区别

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

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

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

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

 

三、流量

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

 

四、回放&观战

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

 

五、安全性

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

 

六、服务器压力

状态同步服务器压力比较大,因为要做更多运算。

 

七、开发效率

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

 

八、知名游戏

王者荣耀、魔兽争霸3、所有格斗类游戏

 

九、断线重连

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

 

 

十、注意点

需要保证每次随机的数字都相同,所以需要自己实现一套随机数,不能用unity自带的那个随机数接口,而且需要服务端发送相同的随机种子;因为非常微小的误差就有可能产生蝴蝶效应,所以所有float型的参数必须变成int型,保证计算结果一致。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 帧同步状态同步是指在多人游戏或分布式系统中同步数据的两种方法。 帧同步是指通过每一帧的数据来同步多个客户端或服务器的游戏状态,这种方法通常是在实时性要求较高的游戏中使用。 状态同步是指通过同步游戏状态的关键信息来同步多个客户端或服务器的游戏状态,这种方法通常是在实时性要求不高的游戏中使用。 简单来说,帧同步更注重实时性,而状态同步更注重效率。 ### 回答2: 帧同步状态同步是多人游戏开发中常用的两种同步方法,它们之间有着明显的区别。 帧同步是指在多人游戏中,服务器作为主机,控制着游戏的逻辑运算和帧频的同步。服务器负责计算所有玩家的操作,然后将结果发送给所有客户端进行展示,以保持游戏的一致性。帧同步的优点是能够确保所有参与者在不同的客户端上看到的游戏画面是相同的,所有玩家的操作都按照相同的顺序进行处理,保证游戏的公平性和一致性。然而,帧同步也存在一定的延迟,由于需要将操作发送给服务器并等待服务器的响应,对快速反应要求较高的游戏可能会出现一些延迟问题。 状态同步是指在多人游戏中,所有客户端通过网络实时传输各自的状态信息,以保持游戏的一致性。每个客户端都维护着自己的状态,并将其发送给其他客户端,其他客户端会在接收到状态信息后进行相应的处理和展示。状态同步的优点是能够实现较低的延迟,对于需要快速反应的游戏尤为重要。然而,状态同步也容易受到网络延迟和丢包等因素的影响,可能会导致各个客户端之间的状态不一致,需要通过一些冲突解决机制来保持游戏的一致性。 综上所述,帧同步状态同步都有各自的优点和局限性。选择哪种同步方法应该根据具体的游戏需求来进行权衡,平衡游戏的延迟要求、公平性和一致性等方面的需求。 ### 回答3: 帧同步状态同步是两种不同的网络同步模式,主要应用于多人在线游戏中。 帧同步是指通过在游戏中定义固定的时间间隔,将游戏中的各个玩家的操作指令同时传输给所有玩家,以保证各个玩家之间的游戏画面完全一致。具体实现方式是,服务器在每个固定时间间隔(例如每秒钟)将所有玩家的操作指令进行收集,并广播给所有玩家,然后所有玩家根据接收到的指令来更新各自的游戏画面。由于帧同步需要将所有玩家的操作指令广播给所有玩家,因此对带宽和延迟要求较高。 而状态同步是指服务器维护游戏中所有玩家的状态,并将状态变化的信息以及玩家的操作指令广播给所有玩家,以保证各个玩家之间的游戏状态保持一致。具体实现方式是,玩家的操作指令先发送给服务器,服务器接收到指令后,先进行状态更新,然后再将状态变化的信息和指令广播给所有玩家,其他玩家接收到后根据接收到的信息更新各自的游戏状态。相比于帧同步状态同步对带宽和延迟的要求较低,因为只需要传输状态变化的信息和操作指令。 综上所述,帧同步着重于保证游戏画面的一致性,对带宽和延迟要求较高;而状态同步着重于保证游戏状态的一致性,对带宽和延迟的要求相对较低。选择使用哪种同步方式可以根据具体游戏需求和网络环境来决定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值