什么是“非线性叠加”?线性又是哪条线?

作者:绯夜氏 云玩家hotspot 2019-11-05
都说游戏玩的开心最重要。有些玩家,玩游戏的目的是为了满足社交需求,大家玩、他也跟着一起玩,最后搞得大家都很快乐;而有些玩家则不同,他们是为了满足自己、在游戏中有更高的追求。

这些玩家,他们追求更加合理的过关方式,更加正确的操作方法,更加准确的成功几率,以及更加精准的数据分析。

在日益复杂的游戏系统当中,开发商已经不满足于简单的加减法公式,用攻击力减去防御力的方法已经过时,愈来愈多的增益效果(BUFF)和减益效果(DEBUFF)被添加到游戏当中,越来越多的数字参与到伤害计算过程里,游戏的机制也变得越来越复杂……

当一个个增益效果在头上亮起的时候,你使出浑身解数,一刀劈在怪物头上,打出了99999点伤害!可你知道,这些增益效果到底为你增加了多少伤害,而哪些增益效果比较厉害,哪些增益效果其实只占据了很小一部分?

云玩家Hotspot的上一篇科普文章《什么是“随机”?教你分清“伪随机”和“真随机”》为大家科普了伪随机和真随机的区别,今天就来科普一下什么是“线性叠加”和“非线性叠加”。

简单易懂的“线性叠加”

当多个增益效果叠加在一起时,我们通常会使用“线性叠加”、“非线性叠加”来描述这些增益效果的叠加方式。

在谈及“非线性叠加”之前,让我们好好了解一下相对更简单、更容易理解的“线性叠加”。

所谓“线性叠加”(Linear Superposition),即是指两个变量之间的关系遵从一次函数关系——而一次函数,也就是直线,在数学上可以理解为“一阶导数为常数的函数”“线性叠加”,也就是指“遵从直线的叠加方式”。在计算过程中,每次数值的叠加都会增加相同比例的量,譬如买一个橘子用三块钱,买十个橘子就要用三十块钱。


一般来讲,游戏中的“线性叠加”,指的就是“加法叠算”。比如一个角色的攻击力为100点,路过的圣骑士为他施加了一个王者祝福,假设这个王者祝福的增益是线性叠加,令他获得了20%的攻击力提升,那么这个角色的攻击力就变为100+(100*0.2)=120点攻击力。

此时又路过了一个假面骑士,为他施加了一个王者祝福2,令他获得了30%的攻击力提升,那么这个角色的攻击力就变为100+(100*0.2)+(100*0.3)=150点攻击力。

举个例子来说,《Fate/Grand Order》(《命运-冠位指定》)的所有增益、减益效果都是线性叠加的。如果你为一名英灵叠加了两层50%的攻击力加成,那么这名英灵造成的伤害就翻倍;而如果一名英灵获得了两层50%的受伤减免,那么这名英灵的受伤减免将叠加至惊人的100%,也就是我们常说的:无敌!(这个无敌甚至不能被无敌贯通,真是太无敌了)


而《Fate/Grand Order》中常见的低星英灵过高难本也正是依赖于“线性叠加”的机制,使用阿斯忒里俄斯(小牛)的宝具降低BOSS的攻击力、使用布狄卡的宝具提升防御力等等操作,尽可能地使己方英灵达成“伪无敌”(减伤叠加至100%)的效果,免除BOSS对其造成的伤害。

“非线性叠加”是怎么叠加的?

在理解了“线性叠加”以后,“非线性叠加”的意义就跃然纸上了。

从概念上来说,“非线性叠加”(Non-Linear Superposition)当然是指并非一次的函数关系——图像不是直线,变量不成正比。譬如,买一个橘子用三块钱,买十个橘子时,老板说:算你批发价,十个橘子只用二十五块。那么平均下来,你买一个橘子只用了两块五,低于一个橘子的单价三块钱。对“十个橘子”的叠加态而言,每个橘子的叠加价格变少了,这就是一种“非线性”。

大部分游戏中的“非线性叠加”相对来说更加容易理解一些。如果有部分数值声明是“非线性叠加”的,那么通常来说,这些数值是相互独立的。与“线性叠加”相对的,“非限定叠加”的部分通常是“乘法叠算”。

还是拿数值最好理解、最好研究的两款相似的游戏《Dota2》和《英雄联盟》来说。在《英雄联盟》中,所有英雄都有“暴击几率”这个属性,而购买“绿叉”、“电刀”、“无尽”等装备将会为英雄叠加暴击几率。


在《英雄联盟》中,“暴击几率”是“线性叠加”的。绿叉提供30%暴击,无尽提供25%暴击。很容易理解,如果一个英雄同时装备绿叉和无尽,那么他的暴击几率将会叠加至30%+25%=55%。

而在《Dota2》中,“暴击率”是“非线性叠加”的。譬如幻影刺客的大招“恩赐解脱”拥有15%几率造成200%/325%/450%伤害,而道具“代达罗斯之殇”提供30%几率造成235%伤害。在“非线性叠加”的情况下,幻影刺客装备代达罗斯之殇进行一次普通攻击时,将会分别对“恩赐解脱”和“代达罗斯之殇”的暴击几率进行一次独立计算。


也就是说,幻影刺客的一次普通攻击将会发生四种情况:1.触发“恩赐解脱”的暴击、没有触发“代达罗斯之殇”;2.触发“代达罗斯之殇”的暴击、没有触发“恩赐解脱”;3.同时触发“恩赐解脱”和“代达罗斯之殇”的暴击;4.没有触发“恩赐解脱”和“代达罗斯之殇”任何一方的暴击。

显而易见,前3种情况都能算作触发暴击,而没有触发暴击的只有第4种。也就是说,幻影刺客的暴击率被提升至了P(A)=1-(1-0.15)*(1-0.3)=40.5%。

(题外话,4种情况中,其中1和2的情况比较好理解,各自发生了一次200%/325%/450%倍率和235%倍率的暴击。而3的情况,同时触发两种暴击时,会采用倍率较高的那一方来计算这次暴击。也就是说,PA出大炮的收益并非简单使用暴击概率模型就能推算得出。具体的收益算法我们今后有空再来分析。)

到了这一步,就能很清楚地看出,幻影刺客的暴击率并非简单的15%+30%=45%,而是更低的40.5%。代达罗斯之殇所提供的暴击率实际上被“稀释”了,并没有发挥出它应有的30%效果。

在船长“昆卡”的水刀还没被削弱之前,中单船长通常堆叠2~3件代达罗斯之殇作为暴击输出装备。2件代达罗斯之殇“非线性叠加”的暴击率为51%(亏损9%),3件代达罗斯之殇“非线性叠加”的暴击率为65.7%(亏损24.3%)。所以到了版本末期,船长很少补出第三把大炮,而是转出狂战斧、辉耀、圣剑等其他属性的装备作为伤害补偿。

(顺带一提,类似船长的水刀、狂战斧的溅射、猛犸的授予力量等一系列“分裂”效果,是线性叠加的,也就是可以简单地做加法计算。)

不仅暴击率如此,闪避率也是如此。

幻影刺客(为什么每次谈及数值的话题总能用上这个神奇的女人?)的被动“魅影无形”满级时能够提供50%闪避几率,道具“蝴蝶”提供35%闪避几率,在被普通攻击命中时,需要独立计算双方各自的闪避——同样的,幻影刺客的闪避几率被提升至P(B)=1-(1-0.5)*(1-0.35)=67.5%,蝴蝶提供的35%闪避被“稀释”到了17.5%,几乎亏损了一半的收益。这也是为什么幻影刺客通常不出大炮和蝴蝶的原因。


提到“闪避”,就不得不提“闪避”的宿敌“金箍棒”。在某次版本更新时,金箍棒的效果从100%必中削弱至75%,与闪避的克制公式更加扑朔迷离。


在装备金箍棒的英雄分别攻击装备蝴蝶的普通英雄、没有装备蝴蝶的幻影刺客和装备蝴蝶的幻影刺客时,各自的闪避几率分别为8.75%、12.5%和16.875%。蝴蝶在面对金箍棒时效果从35%降低至8.75%和4.375%,甚至还不如辉耀附加的闪避效果,可以说是性价比极低了。

除了《Dota2》之外,像《最终幻想14》中易伤减益与其他增益之间的效果提升也是非线性叠加的。譬如忍者的背刺提供10%易伤效果,换算得10%伤害增加;龙骑士的龙眼效果会使目标获得5%伤害增加,那么同时获得龙眼增益、背刺增益的角色将会获得1.05*1.10=1.155倍伤害增加,比1+0.1+0.05=1.15还高了0.05倍率。


非常好懂的一点在于,由于是乘法叠算,因此在倍率低于100%时(常见于命中率、闪避率、暴击率等上限100%的数值),“非线性叠加”的效果是越叠越差的,也就是常说的“边际效益递减”;反之在倍率高于100%时(常见于伤害增加等),“非线性叠加”的效果是越叠越好的,即“边际效益递增”。

“边际效益”与“等比血量”的换算

有一点要提及的是,“边际效益递减”也并不是总是等同于“效益递减”。

还是拿《Dota2》和《英雄联盟》来举例。早先,在《Dota2》的护甲减伤公式还没有彻底脱离war3公式之前,《Dota2》和《英雄联盟》的护甲减伤公式分别是:0.05*护甲/(1+0.05*护甲),以及护甲/(100+护甲)。

(换算可得,当护甲分别为20和100时,护甲所提供的物理减伤达到50%。可以推算得《英雄联盟》的护甲的效果和5倍《Dota2》护甲是等值的,从《Dota2》公式中得出的结论与《英雄联盟》相同,因此之后将省略《英雄联盟》部分的推算。)

从公式上就可以看出护甲减伤是服从“非线性叠加”,而减伤百分比的倍率低于100%,很明显护甲收益是“边际效益递减”的。

当护甲为0时提供0%减伤,当护甲为3时提供13%减伤,约等于每点护甲提供4%减伤;

当护甲为87时提供81.31%减伤,当护甲为90时提供81.82%减伤,约等于每点护甲提供了0.16%减伤。

随着护甲不断提升,每点护甲提供减伤百分比的提升越来越少,叠护甲似乎效果越来越小……

但是!

虽然护甲减伤的收益在递减,但是换算成等比血量的提升却是相同的。根据护甲减伤公式可得每1点HP变为1/(1-0.05*护甲/(1+0.05*护甲)),等价于1*(1+0.05*护甲),即无论当前护甲有多少,每1点护甲都能提供5%的等比血量提升(《英雄联盟》中看做1点护甲提供1%等比血量提升)。

举个例子,想要达到98%减伤,需要980护甲;而想要达到99%减伤,则需要惊人的1980护甲。尽管看似这多出来的1000护甲只提供了1%的减伤,但仔细计算一下就能发现,这1000护甲能让英雄的血量翻一倍。

假设一个单位有2点血,原本需要100伤害(经过98%减免后为2点)才能杀死他,现在却需要200伤害(经过99%减免后为2点)。

也就是说,尽管护甲减伤是非线性叠加,但是护甲所提供的等比血量却是服从线性叠加的。除非对方使用魔法伤害攻击,否则在面对相同的物理伤害时,无脑堆叠护甲几乎不会是一个错误的选择。

——以上结论,目前对《英雄联盟》、以及其他使用相似公式的游戏(比如《魔兽争霸》)仍旧适用。而对新版本的《Dota2》已不再适用,因为《Dota2》在去年曾经修改过一次护甲公式,目前的护甲减伤公式为:0.052*护甲/(0.9+0.048*护甲)。

每1点HP则根据公式修改而变为1/(1-0.052*护甲/(0.9+0.048*护甲)),等价于(0.9+0.048*护甲)/(0.9-0.004*护甲),不再服从于线性叠加,想要计算也变得相对困难起来。(下图以及等比血量公式均来自于贴吧)


不过可以看到新版的护甲减伤公式更加“奔放”,在护甲达到30时、再向上堆叠护甲将会获得巨大的减伤和等比血量提升。当护甲达到210时,等比血量提升甚至达到了惊人的18200%;当护甲达到225时,函数计算结果趋向正无穷,也就是物理免疫——这是旧版本公式达不到的一个巅峰。


护甲公式的更改使得高护甲单位和高护甲装备收益颇大,也促使了炎阳纹章这类装备的崛起。在TI9的比赛上,OG体系使这件默默无闻的装备声名鹊起,通过堆叠护甲促成“超级核心”的打法也成为TI赛场上的主流。

相信在TI比赛结束后的第一个Major中,更多有关护甲的研究会引领比赛的节奏吧。

(图片来源于网络)

作者:绯夜氏  
来源:云玩家hotspot
原地址:https://mp.weixin.qq.com/s/f9KB20Xk_9q2Z4bNCV4EQg

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

商务合作 查看更多

编辑推荐 查看更多