1.游戏同步
网络同步实际上同步的就是前面介绍的帧,描述的是帧数据里面包含什么内容、帧数据怎么传输到服务器、怎么转发给其他玩家以及对帧数据进行怎么样的处理
在帧的基础上,游戏同步又分为两种场景方案:
-
帧同步(Locksetp)
所有玩家的操作被打包到逻辑帧里,广播给其他所有玩家,所有玩家根据操作内容还原状态(如王者荣耀),优点是计算量轻、延迟低并且可以做帧回放,缺点是容易受到外挂攻击,需要进行一致性算法支持 -
状态同步(State sync):
所有玩家直接从服务器同步世界当前状态,常用于射击类游戏(如守望先锋),优点是服务器权威可防作弊,缺点是服务器压力大带宽占用高
两种同步方案只是描述帧内数据和传输方式,游戏的最终同步效果依赖于逻辑帧的周期完成
2.网络与帧间协调
在多人网络游戏中,网络与帧之间的配合直接决定了玩家游戏体验,需要考虑网络延迟(高Ping)时,帧数据穿越千里之后如何得到妥善处理
-
帧延迟(delay)
如果固定逻辑帧间隔为50ms,当玩家操作在网络延迟情况下100ms后才被服务器接收,然后再通过50ms才广播给其他客户端,此时逻辑帧周期已经过了两帧了,此时客户端收到这个帧包后需要怎么处理呢? -
客户端预测(Prediction)
想象一下,如果玩家进行移动操作,客户端将移动数据传输给服务器后,服务器按逻辑帧周期广播帧回到当前客户端,此时客户端再进行渲染帧周期,如果网络延迟高的情况下,会导致玩家操作后很久之后画面上才有响应。那这就需要客户端能够进行预测执行,客户端直接预估操作结果不等服务器确认,来保证操作得及时响应 -
状态回滚和重播(Rollback)
当客户端预测结果和服务器同步的状态不一致,此时客户端需要回滚之前的预测,然后重播预测失败的操作之后的所有操作,使客户端能够到达当前正确的世界状态 -
客户端插值(Interpolation)
当客户端收到服务器下发的两帧数据之间有帧数据丢失了,比如帧1是玩家从A移动到B,帧2是玩家从B移动到C,帧3是玩家从C移动到D,如果帧2丢失,那么客户端将要处理玩家从A移动到D,如果不做任何处理,客户端上给人的体验就是玩家闪现到了D,让人觉得开挂了。此时客户端可以进行插值,对A和D点之间插一些渲染帧,实现玩家平滑移动到D点