游戏开发论坛

 找回密码
 立即注册
搜索
查看: 11117|回复: 1

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

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32132
发表于 2017-8-24 10:31:12 | 显示全部楼层 |阅读模式
无数玩家童年的神作重新回归,手机端多人联机,呼朋引伴一起重温当年的热血大作。

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

微信图片_20170824102651.jpg

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

移动同步

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

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

微信图片_20170824102655.jpg

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

微信图片_20170824102658.jpg

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

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

微信图片_20170824102701.jpg

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

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

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

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

微信图片_20170824102704.jpg

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

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

via:Gad

95

主题

1089

帖子

3301

积分

论坛元老

Rank: 8Rank: 8

积分
3301
QQ
发表于 2017-8-26 14:30:10 | 显示全部楼层
所有数据都在内存中,计算一下好了,没那么复杂吧:
如果是快速射出:直接通过技术射出角度和速度就可以了.还可以直接随机给予命中几率.
如果是慢速射出:那也就计算碰撞就好了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-5-15 11:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表