何为网络同步,通俗点讲,就是在一个网络游戏里有玩家A和B同框,当A释放了一个技能,状态发生了变化,B又是如何及时表现A的当前状态的呢,就是通过网络同步技术。 不同的同步模型,目的都是为了保持每个客户端的状态一致,而一般客户端的初始状态是相同的,不同的同步模型采用不同的方式,其实就是在玩家有操作输入时,让所有玩家的客户端的状态仍能够保持一致。 假设客户端的某一对象的状态初始为S0,而玩家的输入为It,玩家输入后根据逻辑F产生了一个状态的变化SΔ,那么在某一时刻n的状态Sn,理论上是Sn=Sn1+SΔ,考虑到初始状态的话
即为了让所有客户端的Sn一致,不同的模型采用了不同的方案。当前常见的同步方案主要有两种,即锁步同步(LockStep,又被称为“帧同步”)和状态同步(StateSync),两者的本质区别在于
确定性,即给定相同的初始条件和相同的输入集,能够得到完全相同的结果。对于锁步同步,因为只同步了,所以必须要保证严格地确定性,才能保证每次得到的状态相同,后续的状态才不会产生偏移。而对于状态同步,所有客户点以服务器的状态为准,所以保证关键状态与服务器下发的一致即可。客户端的不确定性包括浮点数运算、操作系统、算法、第三方库等等。
基于实现不同,两种同步模型在某些方面的特征
虽然在一些方面表现出了差异,但是关于哪类游戏应该选用哪种同步模型,除了一些对某些要求比较极端的游戏类型更适合哪种模型之外(比如对实时性有着极强要求的格斗类游戏(FTG)适合使用锁步同步,而有大量玩家同时在线的MMORPG适合选用状态同步),没有严格的选用标准。一般围绕着核心玩法、安全性、开发维护成本等方面进行评估。
而作为一个单局PVP为主的FPS游戏,单局内可观察的网络对象较少,网络流量负担较小,而PVP要求保证公平性,以服务器的算结果作为权威,在安全性有更大优势的状态同步更为合适,且没有客户端不确定性的风险,开发负担更小,版本质量更加可控。
为大家所熟知的,TCP和UDP主要有以下几个特点 TCP:
UDP:
一眼看上去,似乎tcp是最佳的选择,拥有我们想要的所有东西,使用起来也非常方便,但正是因为它部分强大的功能,在某些情况下,特别是在弱网情况下,会对网络的实时性会造成严重的影响。其中包括
以上TCP影响实时性的几点特性,除了1可通过配置避免之外,其他两个都是无法做出调整的,这导致了相对于UDP,TCP的传输速度慢很多,特别是在弱网的情况下,会大大影响游戏的体验。所以对网络实时性有要求的网络游戏,基本都采用UDP作为传输的协议,再根据需要,基于UDP开发一套可靠的协议。
其实选用UDP的原因只是TCP的那几个严重影响实时性的功能无法关掉而已,而TCP关于连接的概念、可靠保序的实现方式等都是值得借鉴的。下面是在UDP之上实现的一套协议
连接可以有多种状态,比如开始连接、连接中、断开连接等,通过这些状态,我们可以知道客户端和服务器的交互情况,玩家是否正常游戏。
根据对可靠性的不同需求,一般会实现不同可靠程度的通信通道(channel),包括
只实现了不可靠保序和可靠保序。(不可靠不保序应用价值不大?) 两者的实现都是基于数据包Package的序列号Seq实现的,每个channel记录了两个seq : 1.当前channel的从socket收到的最大的seq(last_recv_seq_);2.当前channel已经处理的数据包的seq(recv_read_seq_)。在上层从调用接口(ReadData)读取缓冲区数据时,两者的处理方式不同
重传的策略有两个,超时重传+快速重传。 数据包触发重传的条件有两个:
DevRTT是Deviation RTT。在Linux下,α = 0.125,β = 0.25, μ = 1,∂= 4 。一般为了防止极端情况下rto过大或过小,可以对rto的值进行”钳位“。
3.1 数据包头PkgHead
struct PkgHead {
int seq; // 超时重传依据该seq
...
}
3.2 网络包包头DataHead
struct DataHead {
int cmd; // ACK确认以及RTT等统计依据该seq,网络包不会重传,网络包的内容可以是重传的包
...
int last_ack;
int ack_bits; // 服务器已收到的客户端包的最近的32个序列(即是服务器的ack序列),大于32即算丢包
...
}
对网络包的数据字段进行了压缩,压缩算法采用LZ4。 https://lz4.github.io/lz4/ 从其github上所贴出的测试数据可以看出,该压缩算法在压缩、传输和解压的综合性能上相比其他算法还是比较优秀的。对服务器性能的影响较小,且能节约带宽。
加密采用了简单的异或操作,将压缩后的包体根据特定规则生成的密钥进行异或操作。密钥由单局分配connection时进行生成,并通过开始单局的ntf下发给客户端
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有