游戏服务器开发:万象同步

120 阅读3分钟
1.游戏同步

image.png 网络同步实际上同步的就是前面介绍的,描述的是帧数据里面包含什么内容、帧数据怎么传输到服务器、怎么转发给其他玩家以及对帧数据进行怎么样的处理
在帧的基础上,游戏同步又分为两种场景方案:

  • 帧同步(Locksetp)
    所有玩家的操作被打包到逻辑帧里,广播给其他所有玩家,所有玩家根据操作内容还原状态(如王者荣耀),优点是计算量轻、延迟低并且可以做帧回放,缺点是容易受到外挂攻击,需要进行一致性算法支持

  • 状态同步(State sync):
    所有玩家直接从服务器同步世界当前状态,常用于射击类游戏(如守望先锋),优点是服务器权威可防作弊,缺点是服务器压力大带宽占用高

两种同步方案只是描述帧内数据和传输方式,游戏的最终同步效果依赖于逻辑帧的周期完成

2.网络与帧间协调

image.png 在多人网络游戏中,网络与帧之间的配合直接决定了玩家游戏体验,需要考虑网络延迟(高Ping)时,帧数据穿越千里之后如何得到妥善处理

  • 帧延迟(delay)
    如果固定逻辑帧间隔为50ms,当玩家操作在网络延迟情况下100ms后才被服务器接收,然后再通过50ms才广播给其他客户端,此时逻辑帧周期已经过了两帧了,此时客户端收到这个帧包后需要怎么处理呢?

  • 客户端预测(Prediction)
    想象一下,如果玩家进行移动操作,客户端将移动数据传输给服务器后,服务器按逻辑帧周期广播帧回到当前客户端,此时客户端再进行渲染帧周期,如果网络延迟高的情况下,会导致玩家操作后很久之后画面上才有响应。那这就需要客户端能够进行预测执行,客户端直接预估操作结果不等服务器确认,来保证操作得及时响应

  • 状态回滚和重播(Rollback)
    当客户端预测结果和服务器同步的状态不一致,此时客户端需要回滚之前的预测,然后重播预测失败的操作之后的所有操作,使客户端能够到达当前正确的世界状态

  • 客户端插值(Interpolation)
    当客户端收到服务器下发的两帧数据之间有帧数据丢失了,比如帧1是玩家从A移动到B,帧2是玩家从B移动到C,帧3是玩家从C移动到D,如果帧2丢失,那么客户端将要处理玩家从A移动到D,如果不做任何处理,客户端上给人的体验就是玩家闪现到了D,让人觉得开挂了。此时客户端可以进行插值,对A和D点之间插一些渲染帧,实现玩家平滑移动到D点