《魂斗罗:归来》子弹中没中,没你想得那么简单!

    无数玩家童年的神作重新回归,手机端多人联机,呼朋引伴一起重温当年的热血大作。除了IP,剧情,对工程师而言,《魂斗罗:归来》更要解决的联机同步和命中同步等问题,简单说,一颗子弹打没打中,没你想得那么简单!

    《魂斗罗:归来》子弹中没中,没你想得那么简单!_第1张图片

客户端高级工程师聂鹏和田亚涛本周在《论道》开聊,小小子弹命中的大问题!
移动同步
    最左边是1P玩家的持续,中间是DS,右边是3P玩家。玩家走路,会有一个MoveStep,MoveStep里包括了各种移动计算,操作以后它会把移动的包,即SendMove发到服务器,服务器会根据这个包进行MoveStep。计算之后,根据当前服务器计算的结果和客户端上报的结果,进行对比,即CheckCheat,看位置有没有差异,客户端有没有作弊。如果有作弊,客户端会向iP玩家发送一个AdjustOwner,进行校正,校正可能会导致1P玩家有拉扯。

  《魂斗罗:归来》子弹中没中,没你想得那么简单!_第2张图片

瞬发型同步模型和投射类同步模型 

    《魂斗罗:归来》子弹中没中,没你想得那么简单!_第3张图片

    瞬发型同步模型中,需要达到的目标是本地预表现,响应及时,体验顺畅。核心点是命中校验和反外挂。1P玩家发送射击开始和结束事件,过程由DS计算并同步给3P玩家表现。本地检测命中后预表现命中效果,需发送当前时刻的状态序号给DS做命中判定。DS收到后回滚角色发射时刻信息,校验弹量、射程、方向、位置、阻挡等信息。验证通过,执行伤害并同步给所有客户端。 

《魂斗罗:归来》子弹中没中,没你想得那么简单!_第4张图片

    这是本地发射开火,但并不会真的发射子弹出来,服务器开始创建子弹,同时给两端玩家进行。假设他们一起开始,伤害是在DS进行的,本地只是预表现,不做检测。目标是牺牲局部实时性,与3P保持弹道一致,公平性优先。核心点是延迟补偿,平滑差值。外网偶尔会反馈一些问题,比如命中无效、击穿问题、弹量闪跳,这些都是非常影响体验的。命中无效就是打着没伤害,第二就是会穿人,子弹会穿过去,还有就是在设计的时候,按着开枪的时候,弹量会闪跳。

命中无效:回滚250毫秒历史事件    

    《魂斗罗:归来》子弹中没中,没你想得那么简单!_第5张图片

    在C/S架构中,DS收到的目标是一个RTT前,敌人所在的位置,当你扣下扳机时他已经跑了。这个大部分原因是网络延迟。目前的解决方案是,回滚250ms的历史事件,回滚到这个点,没有取到信息,之前是会判定命中无效。如果大于250ms,还会增加一个检查,看你是不是还在这个位置。如果你没动,对方没动或动了但在250ms之内,还是会产生伤害,只是伤害会产生延迟。

原文:点击打开链接

你可能感兴趣的:(架构设计)