好吧,肉搏的艺术,篇2:运算与预判
《WOW相关机制深度解析:从程序运作到实战预判》
WOW的程序运行原理可能会让人觉得头昏脑涨,但在近战搏斗时,这个因素却不得不考虑。所以呢,耐着性子看吧。要是实在看不进去,那就直接去看预判部分吧,那部分比较容易理解(毕竟弄明白怎么做,要比弄清楚为什么这么做简单一些)。
**一、走位机制**
WOW里的走位运算方式如下:玩家客户端(也就是玩家这边)会从服务器端获取周围所有角色的位置、方向和速度等信息。这种信息更新大概每秒进行4 - 6次,间隔是固定的。不过呢,当服务器端的玩家位置信息没有更新时,为了节省带宽,就不会发送位置更新信息了。这时候,在客户端显示的该玩家就会按照之前的方向和速度一直移动,直到服务器端发送新的更新信息为止。与此同时,客户端每秒也会向服务器端发送自己的位置、方向和速度信息大概4 - 6次,这也是固定的时间间隔。这就意味着,所有角色在服务器端的运行速度并非是线性的,而是跳跃式的。要是你的速度足够快,在服务器端看起来就像是在瞬移。但在其他人眼中,你不会瞬移,只是快速改变方向罢了。因为当你的位置信息不更新时,你的位置是由客户端自己计算出来的,而在服务器端你的位置实际上并没有改变。
所以啊,如果某个玩家掉线了,那么在服务器端这个玩家角色的位置就停止更新了。在其他玩家看来,这个掉线玩家将保持掉线前的运行状态,做匀速直线运动。但是,如果你想要攻击或者治疗这个掉线玩家,就必须接近他掉线时的位置才行,因为在服务器端从掉线那一刻起他就没动过。由此可以得出:玩家看到的角色位置和服务器端的位置是不一样的,而且这个差距会随着速度的增加而增大。
**二、技能运算机制**
WOW的技能运算是这样的:按下技能键的瞬间,部分技能会进行本地判定(比如距离、方向、位置等条件的判定),而有些技能则不会。要是本地判定失败了,这个技能就直接无法释放。这就是为什么有时候明明预判到了对方的位置,却放不出技能的原因。本地判定是完全依据你看到的情况进行的,哪怕服务器端对方就在你面前,只要在你的屏幕上看不到,这个技能就判定失败。
当本地判定通过(或者不需要本地判定的技能被按下)时,一个发送技能的申请会被发送到服务器。服务器端在接收到这个申请的瞬间,会进行一个服务器端的技能释放判定。每个技能都必须通过这个判定,和本地判定一样,要对距离、方向、位置、法力等条件进行检验。这个判定是完全按照服务器端的情况进行的,即便你在自己屏幕上看到自己的位置很合适,也可能通不过服务器端的判定。
当判定结束,服务器端认为该技能可以释放时,这个技能也不会马上发挥作用,而是会被插入到一个运行队列里。这个队列包含了所有的持续伤害(dot)、持续治疗(hot)、直接伤害(dd)、增益(buff)、减益(debuff)等等,这些都会在下一个心跳周期(程序完成一次完整循环的时间)统一进行计算,并在周期末尾统一更新。实际上,服务器的心跳周期在1/4秒 - 1/6秒之间(和位置更新类似),如果服务器运算繁忙,这个时间还会增加。这就是为什么会出现血加出去了但是人也同时死了,或者和对方同时放出控制技能,甚至同时直接杀死对方的情况。因为不管按键先后,只要申请在一个周期内到达服务器,就会按照同时运行来处理。也就是说,服务器端对技能的发动判定是即时的,但对技能的运算是伪即时的、非线性的。
**三、中场休息与游戏中的一些小知识**
看到这里,没有程序设计基础的玩家可能已经晕头转向了。要是直接跳着看到这里,那可能效果不佳。休息时间可以随意去上个厕所,我再来说点别的。比如说野性德其实很需要闪避属性,在《燃烧的远征》(TBC)版本里这个属性很让人满意。当闪避达到40%的时候,几乎可以正面“猫死”盗贼,尤其是当盗贼只有20%左右闪避的时候。而且野性德还有很厉害的暴击回血光环。需要注意的是,在6秒内停止行为并且连续避免伤害(比如闪避、抵抗、免疫都算),就可以脱离战斗。也就是说盗贼开了闪避6秒后就可以脱离战斗。
**四、网络相关机制**
没错,网络是不得不考虑的因素,考虑运算方式就不能不考虑网络。网速分为上行速度和下行速度这两个方面,通常所说的Ping值就是这两个速度的总和,但不是平均值,上下行速度在通常情况下是不对称的。比如说,可能你的上行延迟是100ms,下行延迟是10ms,Ping值总和是110,这个Ping值看起来还不错,但在近战搏斗时就完全不是那么回事了。你所有的操作都会慢半拍,包括走位、释放技能,而你看到其他人的位置却总是正确的。这就意味着如果对方改变方向跑动,你就完全不可能按照屏幕上显示的位置命中对方。
反过来,如果你的上行延迟是10ms,下行延迟是100ms,那么你的所有操作速度正常,但你看到别人的位置都是0.1秒之前的。不过这两种情况的结果是一样的,那就是你必须预判对方的位置,朝着预判的位置进行走位和攻击。所以其实只需要一个Ping值就足够描述网络状况了。
**五、网速的稳定性**
网速并不是固定不变的。实际上,电脑的运算速度从来都不是固定的,不过在正常情况下会围绕一个固定值小幅度波动。比如说偶尔是41.01ms,偶尔是41.02ms,显示的Ping值总是平均值。但是当你的网络波动幅度过大时,就会产生很奇怪的影响,所有人的位置看起来都是阶跃式的,完全不是匀速运动。其实网速的波动幅度也是围绕一个值波动的,而这个值本身也在波动,波动的幅度还在波动。这里就当是中场休息了,讲个冷笑话:野性德最害怕在贫血逃跑的时候被“月火机关枪”打中,也最喜欢在对方贫血的时候用“月火机关枪”。下面我们继续。
**六、预判前奏**
(怎么还没讲到预判呢,真是汗颜啊)如何确定自己的网络状态呢?这可是预判的基础,当然稳定的网络状态也是基础,一直变化的网络根本没办法玩游戏。答案是通过宠物来判断,战斗状态或者非战斗状态都无所谓,只要是处于跟随模式的宠物就可以。判断方式有两种:
1. 直线行进:在直线行进过程中,你的宠物应该做匀速直线运动,就像你自己一样。如果它跑得时快时慢,就意味着你的网速波动幅度比较大。在直线行进时,在0延迟的情况下,你的宠物应该在你身体的一侧,和你完全平行,而宠物跟随的距离就是你的实际网速,这个距离很重要,要记住,在预判的时候会用到。
2. 原地转圈(也就是按住前进键和一侧的转向键):在原地转圈时,你的宠物的运行轨迹应该是一个圆形。实际上永远不会是完美的圆形,而是一个正多边形。这个正多边形的边数越多,就说明你的网速越平滑(同时也意味着服务器运算状态良好),如果看起来棱角分明,就意味着你的网络或者服务器遇到了阻塞。要注意宠物的拐点,两个拐点之间的时间间隔就是位置更新的时间间隔,这个也很重要,不过比较难掌握,尽量多注意吧。
这样我们就知道了自己的实际延迟和位置更新频率,就可以开始预判了。
**七、预判机制**
(终于到预判部分了,是不是感觉头晕呢?这里其实比较简单的)抛开理论,预判实际上并不复杂。走位预判有两种方式:
第一种是自身预判,就是把自己的位置减去延迟间隔量。比如说,如果你的延迟是100ms,那么在进行规避动作时,你就应该把自己看作处于0.1秒前的位置;在释放技能的时候,则要看作在0.2秒之前的位置,因为你的技能释放申请还需要0.1秒才能到达服务器(在正常移动速度下,只要简单地给自己减去宠物跟随的那个距离就可以了)。
第二种是对方预判,就是把对方的位置加上延迟间隔量。比如说,如果你的延迟是100ms,那么在进行规避动作时,你应该把对方看作处于0.1秒后他将要到达的位置;在释放技能的时候,则看作对方在0.2秒之后的位置(同样的,简单地给对方加上宠物跟随的距离就可以了)。
更新频率是一种高阶技巧,实际上你可以走走停停地进行战斗,只要确保每次位置更新的时候你的位置合适就可以了,其余时间你做什么都不影响服务器那边。不过,如果预判距离过大,你就需要额外移动来让本地判定通过。
技能预判是建立在走位预判基础之上的,就是在按下技能键的时候就判断出技能是否能够释放,而不是等待技能已经释放的提示。实际上,在很多视频里都能看到技能预判的情况,在技能效果(比如数字之类的)出现之前就已经离开近战范围了。这个没有什么技巧,完全依靠实践和经验。走位预判的精确度会影响到技能预判。,普通攻击可以看作是一个每隔一定时间自动释放的技能,所以普通攻击也可以应用技能预判。可以特意在一次普通攻击之后走开,或者掌握好间隔在人形态释放普通攻击,这是为了十字军效果。慢速武器的预判效果会很明显。
,实际上80%的伤害/治疗数字显示的时间都比实际效果出现的时间要晚0.2秒以上,这和服务器的心跳运算方式有关。战斗记录和走位是同步突发式发送的,每秒大概4 - 6次(注意,不是一次一条记录,而是一次一堆记录)。
我们可以利用预判来确保自己的技能/普通攻击都能打到对方的背后,并且在打出攻击之后利用预判及时脱离近战范围,以保证自己受到最小的伤害。
**八、结尾与花絮**
嗯,感谢阅读。能看到这里确实不容易,这些纯理论的东西看起来让人头疼,实际效果也不是特别明显,但多学习一些运算方式也是有好处的。
曾经有一段时间流行过一种说法,就是[跳起之后的位置按起跳前来计算]。实际上这是对预判的错误。由于服务器端每秒只更新4 - 6次位置,所以在你起跳之后的0.25秒内(如果服务器状态不好这个时间还会更长),你的位置在服务器端并不发生变化。这时候,一些不需要本地判定的技能就可以释放,同时对方也能在近战中打到你,因为在服务器端你仍然在他面前,即便你自己这边看起来已经跳到对方背后了。当然,这个算法也能解释为什么盗贼开了疾跑而你中了减速之后几乎打不中他,因为他的位置在服务器端就是一些分散的点,完全不经过你身边。同理,开疾跑后的盗贼也能从猎人陷阱外围直接跑过而不踩到陷阱。当然,如果从正上方跑的话,就需要相当快的速度或者服务器状态相当差才行。而且,所谓的猫模型漏洞,很多时候实际上是由于位置原因。本身要求背后释放的技能,当你在追尾的时候有一点点延迟,那么在服务器端你实际上已经和对方间隔超过5码了,这样当然就放不出技能了。实际上,在我的第一部视频里和第一个法师那场战斗的开局突袭就是预判,我提前按了突袭,结果就是在我的屏幕上看起来是在我背对他的时候突袭到他的,但实际上在服务器端这个时候他已经在我前方背对我了。
谢谢阅读。
澄拾游戏