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

Gad 2017-08-24
无数玩家童年的神作重新回归,手机端多人联机,呼朋引伴一起重温当年的热血大作。

除了IP,剧情,对工程师而言,《魂斗罗:归来》更要解决的联机同步和命中同步等问题,简单说,一颗子弹打没打中,没你想得那么简单!


客户端高级工程师聂鹏和田亚涛本周在《论道》开聊,小小子弹命中的大问题!

移动同步

最左边是1P玩家的持续,中间是DS,右边是3P玩家。玩家走路,会有一个MoveStep,MoveStep里包括了各种移动计算,操作以后它会把移动的包,即SendMove发到服务器,服务器会根据这个包进行MoveStep。

计算之后,根据当前服务器计算的结果和客户端上报的结果,进行对比,即CheckCheat,看位置有没有差异,客户端有没有作弊。如果有作弊,客户端会向iP玩家发送一个AdjustOwner,进行校正,校正可能会导致1P玩家有拉扯。


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


瞬发型同步模型中,需要达到的目标是本地预表现,响应及时,体验顺畅。核心点是命中校验和反外挂。

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


这是本地发射开火,但并不会真的发射子弹出来,服务器开始创建子弹,同时给两端玩家进行。假设他们一起开始,伤害是在DS进行的,本地只是预表现,不做检测。目标是牺牲局部实时性,与3P保持弹道一致,公平性优先。核心点是延迟补偿,平滑差值。

外网偶尔会反馈一些问题,比如命中无效、击穿问题、弹量闪跳,这些都是非常影响体验的。

命中无效就是打着没伤害,第二就是会穿人,子弹会穿过去,还有就是在设计的时候,按着开枪的时候,弹量会闪跳。

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


在C/S架构中,DS收到的目标是一个RTT前,敌人所在的位置,当你扣下扳机时他已经跑了。这个大部分原因是网络延迟。

目前的解决方案是,回滚250ms的历史事件,回滚到这个点,没有取到信息,之前是会判定命中无效。如果大于250ms,还会增加一个检查,看你是不是还在这个位置。如果你没动,对方没动或动了但在250ms之内,还是会产生伤害,只是伤害会产生延迟。

via:Gad

最新评论
暂无评论
参与评论

商务合作 查看更多

编辑推荐 查看更多