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