同步算法
前言
同步是网络游戏的一大难题,不同类型的游戏对同步有着不同程度的要求,如何解决好同步产生的问题?同步方案(
帧同步,状态同步,状态帧同步
)的区别和联系?网络传输协议(TCP,UDP,可靠UDP
)的区别和联系?下面就让我们一起来学习下吧。
一、网络同步
1)网络同步是什么?
网络同步
是指在有多个计算机或者设备连接到同一网络时,确保这些计算机和设备的时钟精准地保持一致的过程。在网络同步中,每个计算机或设备都会通过一定的协议和算法与其它计算机或设备进行时间同步,以确保设备上的时间准确,没有超前或滞后。
2)为什么进行网络同步?
网络
游戏和单机
游戏的区别就在于多人
游戏还是单人
游戏,对于网络游戏来说,时间的一致性
能保证玩家的体验不会太糟。所以,需要进行网络同步来确保实时性。
二、同步带来的问题?
瞬移和卡顿:
游戏画面伴随着卡顿是很常见的,打王者荣耀有时也会发生角色移动卡顿,然后突然瞬移,穿墙到对方塔里光荣牺牲,迎来队友赞美全家的情况。
攻击判定不一致:
玩家A的画面中,自己打中了玩家B;玩家B的画面中,玩家A没有打中自己;不管偏向于哪一方,另一方都会觉得没有游戏体验。
三、同步问题的原因?
- 同步问题有瞬移,卡顿,攻击判定不一致;
- 产生原因可以归结于延迟和抖动。
1)延迟
- 百度百科定义:网络延迟是指各式各样的数据在网络介质中通过网络协议(如TCP/IP)进行传输,如果信息量过大不加以限制,超额的网络流量就会导致设备反应缓慢,造成网络延迟。
- 网络传输中的发送端传输数据量太大就会在网络中产生拥塞,接受端不会造成网络拥塞。
- 网络延迟 = 发送延迟 + 处理延迟 + 排队延迟+传播延迟
简单理解:想象一下过年春运的交通,你从目的地到家车上待的时间(
传播延迟
),中间可能要换乘,到达不同的站点,上下车,买票等(处理延迟
),上车后,车上人员会根据安排找一条线路发车(发送时延
),因为春运所以路上发生堵塞(网络拥塞
),你不得不在站点候车(排队延迟
),等待车的到来,你才能去往下一个地点。
2)抖动
- 由于网络延迟,转发链路等的存在,数据包到达接受端的时间是不确定的,可能会发生
丢包
,顺序错乱
的情况,这就是抖动。 - 抖动是衡量一个网络是否
稳定
的指标。
四、同步问题的解决?
1)解决瞬移和卡顿
如果直接设置位置,网络同步的瞬移和卡顿会很明显,思考有没有什么方案去解决瞬移和卡顿
呢?
1. 服务端
方案 | 增大同步频率 |
---|---|
缺点 | 增大服务器压力 |
效果 | 基本达不到预期 |
原因 | 抖动影响数据的同步 频率,如果几条指令或者状态同时到达,还是会出现突然瞬移或者卡顿的感觉,且抖动还会影响接受 频率,导致同步效果变差。 |
2. 客户端
方案 | 插值算法 |
---|---|
缺点 | 插值缓慢移动增加延迟,直接设置位置->插值设置位置 |
效果 | 由于抖动,依然存在卡顿问题 |
原因 | 插值的距离由于抖动长短不一,在相同时间间隔进行插值,速度 v = s / t v=s/t v=s/t可能跳变 |
针对插值算法缺点进行改进,用缓存队列解决速度跳变
的问题:
方案 | 缓存队列 |
---|---|
概念 | 缓存队列在客户端增加一层缓存缓解网络抖动问题,数据包同时到达后先进入缓存队列,客户端依次从中取出数据且还能动态调整取出队列的快慢 |
缺点 | 可能误差更大 |
效果 | 已经能解决大部分网络问题 |
2)解决攻击判定不一致
有三种解决方案:
服务器权威
为准主动方优先
,优先考虑主动攻击的玩家被动方优先
,优先考虑被动防御的玩家
如果不考虑服务器因素,主动方优先,因为被动方可能在挂机。
五、网络游戏服务器考虑因素?
主要从数据同步
,高并发
,通信协议
,业务逻辑
,热更新
,通信传输
,数据库
等方面考虑。
六、同步方案的种类?
根据服务器输入输出的内容,有三类同步方案:
帧同步
(指令->指令),状态同步
(状态->状态),状态帧同步
(指令->状态)。
关于帧同步,状态同步可以参考下列内容:
- 知乎:浅析帧同步和状态同步:对同步优化策略,帧同步vs状态同步的概括很全面
- B站:第二代网络游戏帧同步技术:大致概括网络游戏需要的技术,并简单讲述了帧同步
下面是状态同步vs帧同步,帧同步原理的思维导图:
思考以下几个方面:
1)严格帧同步和乐观帧同步
2)确定性计算
帧同步有两大难点:网路延迟
和确定性计算
影响确定性计算的因素:
浮点数精度
:直接使用整数随机数
:客户端同样的伪随机算法,服务端同步随机种子遍历顺序
:不要用foreach迭代多线程,异步和协程
:关注执行先后顺序
帧同步必须要有相同的运行结果(相同的初始状态+ n n n个相同的指令和规则),所以一切使得同步不确定性的因素都要解决。
3)三角制约和可靠UDP
三角制约:低延迟
,低带宽
,可靠性
不可三者兼得。
TCP
:固定大小数据包,延迟高UDP
:报文发送,不可靠可靠UDP
:在UDP基础上增加可靠性,比TCP减少延迟时间
为什么TCP产生粘包和拆包,而UDP不会产生粘包?
现成的可靠UDP方案有KCP,QUIC,ENet,RakNet,UDT等。
4)断线重连和录像回放
区分同步机制(断线重连和回放,判断哪种同步机制)和常见误区:
七、同步优化的种类?
- 大致有:
表现优化
,延迟优化
,丢包优化
,带宽优化
,帧率优化
。 - 具体可以参考 :知乎:网路同步优化技术
参考
- 知乎:浅析帧同步和状态同步
- B站:第二代网络游戏帧同步技术
- 《百万在线大型游戏服务端开发》