BZ易风

导航

 

差异

帧同步:客户端A将技能释放的请求发送给服务器,服务器广播这个操作的请求到所有的客户端当中,这些客户端在收到了请求以后开始让A释放技能,并且开始检测这个技能是否能命中B,如果B正好在A的攻击范围内,而且状态不是无敌等状态,是可以受到伤害的,这个时候,这些客户端就会把B的血量减少技能所产生的伤害值,各自在各自的客户端当中进行运算,并且播放相应的命中效果。

简单的帧同步是通过服务器转发操作,在各自的客户端当中,独立运算操作的结果,逻辑跑在客户端中,每个客户端都在运行各自的逻辑。

状态同步:客户端A将技能释放的请求发送给服务器,服务器里面有所有客户端的全量的数据,包括所有角色的数据、位置、血量等等状态的信息,这个时候服务器会进行计算,检测这一次A的攻击会给哪些角色造成伤害,如果B刚好在A的攻击范围内,而且状态也是可以受到伤害,这个时候服务器就会把B的血量减少技能所产生的伤害值,把B的状态标记为受到伤害,之后再把运算完成的结果,也就是这些角色的血量、状态信息等广播给所有的客户端,客户端在收到这些数据以后,更新角色的血量信息,播放技能命中的效果等等

简单的状态同步是通过服务器计算操作的结果,再将结果下发到各个客户端中进行表现,逻辑跑在服务器中。

英雄联盟就是基于状态同步来进行开发的。

优缺点

状态同步

优点

安全,逻辑是运行在服务器的,客户端修改的数据去作弊,服务器一下发数据,修改就会被覆盖。

可以随时在战斗的过程中有玩家进出,新加入的玩家只需要在服务器中获取当前时间点里面视野范围里面所有状态数据就行。MMO基本都是使用这种模式,因为很多副本地图都是随时可以有人进出,一起战斗打怪。

缺点

服务器要运行大量的逻辑,比较耗资源,下发的数据结构也比较复杂,服务器的成本要高一些。

帧同步

优点

因为只是转发操作,服务器不处理具体的计算逻辑,负载的人数自然就会更多。

缺点

1.服务器没计算的部分客户端必须算,并且要保证所有的客户端计算的结果都是相同的,但是在不同的平台上浮点数运算的结果是有差异的。

 

 

尽管误差比较小,累积起来可能就会导致游戏逻辑走向不同的分支,产生不同步,为了避免这个问题,就需要做额外的开发,把浮点数替换成定点数来运算。

2.因为运算逻辑是在客户端当中,所以战斗过程中不允许有新玩家进入,比较适合玩家数量比较固定的游戏,比如:MOBA,RTS

3.玩家掉线退出游戏以后也只能从服务器获取到所有操作序列帧,然后从头开始计算一遍,通过加速逻辑帧的运行来恢复战斗,如:王者荣耀

 

角色在环境当中的移动,以及物理碰撞,需要用代码去实现,因为Unity自带的物理引擎是基于浮点数来开发的,为了确保同步,不能使用Character Controller来控制角色移动的,也不能直接拿boxCollider组件去当作角色的碰撞环境。

posted on 2022-01-31 16:17  BZ易风  阅读(512)  评论(0编辑  收藏  举报