网络游戏对战数据同步浅析

    在网络游戏中玩家间对战,数据同步的方式一般有两种,状态同步和帧同步。

     在状态同步中战斗逻辑主要放在服务器端,客户端上传玩家操作到服务器,根据操作由服务器验算战斗逻辑,然后服务器周期性的将逻辑数据比如玩家的坐标、朝向、属性值等数据发送给客户端,而客户端就相当于一个播放器。与帧同步相比,状态同步数据传输频率低帧同步,单次发送数据量要比帧同步大,由于战斗核心计算逻辑后端负责计算,服务器压力比较大,但是对网络的要求低于帧同步。

      状态同步中这样的优点在于不会存在数据不一致问题,断线重连恢复比较快,由于逻辑在服务器端所以作弊比较困难,但是缺点是流量消耗大,对于实时性要求比较高的游戏,手感也会差。

    而在帧同步中战斗逻辑放在客户端,服务器会将时间分成固定时长,且时长极短的时间片,每一个时间片就是一个逻辑帧。服务器在一个时间片内,将收集的玩家的操作,等到时间片结束时,将收集的玩家操作发送给所有客户端,继续采集下一次的操作,等下一次时间到,把收集到的操作发送给所有客户端,由客户端根据服务器发送的玩家操作进行战斗逻辑验算。通过随机数种子、帧序号以及服务器在同一帧想客户端同步数据,相同输入和相同时机来保证客户端对战斗逻辑的验算是相同的。

    对于实时性要求高的游戏需要采用帧同步,用户体验比较流畅,由于只发送玩家的操作数据量不大,比较省流量。但是由于逻辑在客户端容易作弊,还有由每个客户端进行战斗逻辑验算,互相间没法进行校验,容易出现数据不一致的现象,由于服务器端没有玩家状态信息,断线重连恢复需要客户端快速将之前所有逻辑帧验算一遍。

    两种同步方式各有利弊,需要我们根据不同的游戏类型来决定用那种方式数据同步。比如MMO、仙侠类或者传奇类游戏对玩家操作要求不高,主要是拼数值,另外一张地图上玩家比较多,需要同步玩家视野内的战斗单元的战斗数据。因为玩家比较多如果用帧同步,客户端无法处理,另外这类游戏对玩家的操作手感要求没有那么高,主要是拼数值,所以要用状态同步更适合。对于moba、射击类游戏,这种分房间,对玩家手感要求比较高,需要低延迟类型的游戏,则需要用帧同步,状态同步满足不了需求。

    对于状态同步的服务器战斗逻辑都在服务器,具体怎么实现根据自己的需求去实现,而帧同步相对服务器逻辑比较简单,做法大体相似。至于每一帧的时间,如果太长玩家会感觉卡顿,太短则客户端运算压力比较大。目前一般帧同步时每秒15帧,也就是每一帧的时间是66ms,客户端每隔66ms采集一下玩家最后的操作发送到服务器端,不管玩家有没有操作都需要发。服务器端将这一帧收到的玩家操作数据,广播给所有客户端,客户端根据玩家操作数据计算逻辑。一般双方通讯协议会用到protoBuf,因为压缩比比较高,这样数据包会比较小。帧同步还需要随机数种子,这样每个客户端随机出的数是一样的保证,相同的操作输出结果相同。

    帧同步用UDP进行通讯,其实在网络状况好的情况下,TCP的时间延迟也是可以做帧同步的,主要是应对网络波动,由于TCP是丢包重传以及数据顺序发送,当网络产生波动,导致包1发送失败时,会阻止包2的发送,而UDP不会影响包2的发送,TCP有流量控制,会限制发包速率,超时重传机制防止丢包,然后根据序列号组包,数据的发送由协议栈控制,而UDP完全有我们控制,另外UDP传输比较快,帧同步中我们可以对丢包、乱序进行处理。

猜你喜欢

转载自blog.csdn.net/qq_19825249/article/details/108150669