头尾生男生女都一样样?问一数字

暗黑3野蛮人攻速讨论:Thinking In IAS ―暗黑破坏神3专区_17173单机频道
& 野蛮人 & 暗黑3野蛮人攻速讨论:Thinking In IAS
暗黑3野蛮人攻速讨论:Thinking In IAS
文 章摘 要
我所说的很多东西,都是基于假设,测试结果接近也不能说明他就一定是对的,未必可靠,只有官方说的才可靠。
先打个招呼,本文比较长,而且有点枯燥,但如果你愿意认真耐心的读完,应该不会觉得后悔。一 前言 假设一种情况,配装时整体基本配好了,还差个头盔。看到两个暮光头,买哪个?一般情况下攻速高的这个会贵一些,有时候差的还挺多,好几E。于是我经常看到有人会问一个问题:“多1%攻速到底有多大差别?”,这个问题看上去很简单,攻速更高意味着单位时间可以打出更多次伤害,意味着更高的DPS,一些模拟器也会告诉我们,提升1%攻速会提升多少DPS。对于“多1%攻速到底有多大差别?”这个问题,我们考虑的重点是“多大”这两个字。但在这之前,我觉得应该先考虑一下“有”这个字,因为如果”没有 “差别,还谈何”多大”呢。这在很多人看来有些多余,差别很清晰啊,9%&8%么。实际并不是这么简单,我可以先给出答案,对某些人来说,戴这两个暮光头没有差别,不是很小小到忽略不计,而是没有;对另一些人来说,差别会比较大,至少比1%大。简单来说,两个头盔之间是&=的关系,头盔只是个例子,其他装备也都一样。本文主要讨论为甚么有时多1%攻速有变化,有时没变化这个问题。纠正下,上面那句话我发现引起了一些误会,暮光头的1%我只是作为开场白举个例子,讨论的范围不是只限与1%,实际你可能差5% 7%,都会没变化。二 一个对比测试 可能有人不太相信我前面说的答案,先来看一个测试:有3个攻速:A 2.25,B 2.28,C 2.31。 问在这3种攻速下,持续打一个目标5分钟,攻击次数会相差多少?根据以往的经验我们知道,攻速代表每秒的攻击次数,攻速2.25就是一秒打2.25下,5分钟=300秒,那么A会攻击2.25*300=675次,B会有684次,C会有693次。C比B多9次,B比A多9次。 理论上看,应该是这样的。 但我的结果是:A 688次; B 715次;C 715次。B比A多了27次,远大于计算的9次,而B和C则是完全相同。这个现象和我前面说的头盔是一样的,同样是多0.03攻速,有可能在攻击次数上产生很大变化,也有可能完全无变化。 由于这个结果可能比较出乎意料之外,有必要交代一下我的测试环境:攻击对象是A3 10MP罪恶之心,这东西不会动不会反抗,很稳定。 计时我用的是视频,都上传了,有兴趣的可以下载,从第一击抬手的那个画面开始,往后走300秒,然后截断视频,这样从攻击开始到视频结束就是5分钟整,我只需要去统计这段时间打了多少下。我的工具可以精确到秒的小数点后面两位,所以这个300秒是比较精确的,误差最多在0.1秒左右,由这个误差导致多一次少一次是可能的,但不会更大了。肯定不会把9次的差别给吞食掉。计数有很多办法,可以数攻击动作,可以数跳出来的数字。在实际测试中,我发现这两种办法都不靠谱。数跳出来的数字太难,一秒几个数字,一屏幕好多数字,根本分不清哪个是新出来的。 攻击动作是一个固定的频率,人在数固定频率的时候,会在心里形成一个默认频率(你会发现闭上眼睛也能数下去),在频率很高并且需要数很久的情况下,一段时间后这两个频率会产生交叉,你都搞不清自己是在跟着眼睛数还是在跟着心数,这样就是乱掉了。可能清醒的人还好一点,我这几天一直对着这坨肉,感官已经有点紊乱了,真数不清。退一步说,即使不乱,我数完一遍688次,我怎么知道我没数错?再数一遍,数出来689次,不一样,怎么办,哪次是对的?再数一遍,687次,又不一样,完了,难道要数100遍取平均值?一遍5分钟啊!所以,“我很认真的数了几遍,数出来是几”这样的做法是没说服力的,数的时候很容易数错,数完了也没有办法验证对错。我现在用的办法是根据结束时目标血量来算出攻击次数。测试时我的武器,右戒指,项链是这样的:再穿9速的殷娜,拉库尼,暮光,以上这些东西不动。然后依次使用下面3个戒指做左戒指,每个多2%攻速:这样,就能分别得到2.25 2.28 2.31这3个攻速,同时我的DPH被饰品上的最小值属性抬升到固定的98-98,不会浮动,爆伤和力量也是固定的,这样我打出来的数字就是固定的,暴击是3579,不暴击是2105。根据视频结束时目标的血量,可以计算出他掉了多少血,关闭白字,只显示黄字,我只要数5分钟内有多少次暴击就行。非暴击次数可以用(总损血量-黄字次数*3579)/2105算出来,然后将数出来的暴击次数和算出来的非暴击次数相加,就是总共攻击了多少次。这个办法是比较靠谱的,我把爆率控制的很低,只有10%左右,所以黄字的出现的不多,而且不是固定频率,过一会跳一个数字出来,这样就很不容易数错。数完后,我需要用他去做计算,这本身也是个检验的机会。如果用他算出来的非暴击次数正好是个整数,那么说明没有数错,如果算出来是XXX.4 xxx.7这样的,那就说明数错了。以2.25攻速为例,在视频结束时,目标剩5985486血,他满血是7550477,我打掉了1564991血,5分钟数下来造成79次暴击,那么非暴击次数=(*3579)/=609。 609+79=688次,这就是结果。另外,609.14看上去不是很整,是不是数错了?解释下,我们看到的数字,包括跳出来的数字和怪物的血量,都是整数,但实际在每次判定伤害和损血时是会计算小数的,仔细观察会发现有比如跳了数字100,但怪掉了101血这种现象,这是之前小数位累积起来的结果,所以更准确的应该用小数去计算。测试中我的力量是1202,爆伤70,DPH98,用的165%伤害猛击,可以计算出:不暴伤害=98*13.02*1.65=, 暴击伤害=.7=,用这两个数字代入计算会更准确。这个问题不会影响到次数统计,因为打若干次实际损血只比显示的差1,一次伤害就有几千,这些细微的偏差几百次累积起来也远小于一次攻击的伤害,所以他不会造成多一下或少一下的偏差。这是3次测试的结果:攻速总伤害暴击次数非暴击次数总次数2.251564991796096882.281620366786377152.31155553234681715三次测试的视频,视频是60帧采样的。如果你有兴趣,可以下载下来仔细研究,百度盘:
说了这么多还没有进入正题,一直在说测试环境,一些细节和我的想法。因为一方面,只有以可靠的测试结果来做为依据,才能进一步去分析一些原因,得出一些结论。另一方面,最终我碰到了一些问题没解决,所以我想把整个过程中我的想法和做法尽量详细的写出来,这样可以让别人帮我看看问题出在哪里,所以后续还是会很详细。好了,言归正传。这组对比测试的主要目的是引出一个现象:替换5% 7% 9%,这3个带攻速的戒指,每次提升2%攻速,你可能会增加很多的攻击次数,也可能完全没有任何变化。说明攻速不是提升一丝就有一丝变化的,他的变化不是连续的,是跳跃的。必须提升到足够的数量,才会发生变化。 我们以前会以为攻速的变化是连续的,就算只多给0.01攻速,只要给一个够长的时间,比如100秒后,就会多一次攻击。通过这个测试,以及我接下去想说明的是:很可能多给0.01攻速,不管你打多久,300秒,还是600秒,都不会多打一次。有了这个现象,接下来我们寻找原因和规律。 三 从小旋风跳数说起 0.90-1.00 攻速 &= 9 跳1.01-1.11 攻速 &= 10 跳1.12-1.17 攻速 &= 11 跳1.18-1.32 攻速 &= 12 跳1.33-1.43 攻速 &= 13 跳1.44-1.53 攻速 &= 14 跳1.54-1.665 攻速 = 15 跳1.67-1.815 攻速 = 17 跳1.82-1.995攻速 &= 18 跳2.00-2.22 攻速 &= 20 跳2.23-2.4975 攻速 = 23 跳2.50-2.8512 攻速 = 26 跳2.86-2.98035 攻速 = 30 跳 & & & &3.3333这张表是冲刺小旋风跳数和攻速的关系,大部分人都很熟悉这张表,从这里开始讲,因为他的产生过程和我前面提到的现象在原理上是一样的,顺便也正好对这个表做一下解释。其实很长一段时间,我对这个表是不太认可的,为甚么左边的攻速都是这些奇葩的数字,为甚么右边的跳数随着数值的增长开始变的不连续,不能有19跳吗?各种疑问,甚至一度认为他是错的,实际在论坛上也确实流传着一些有细微错误的版本。我以前一直认为:“尾气没有这么复杂。如果一个技能写造成XXX% 武器伤害,代表他每秒攻击攻速次,每秒XXX%*攻速*DPH的伤害,猛击,先祖都是这样,尾气也一样,区别只是,尾气的60%不是一次产生,是拆分成3 个20%来产生,于是每跳20%DPH,每秒就是攻速*3跳,3秒就是攻速*9跳”。 &我一直觉得我的想法比这个表更合理,但实际对错还是要通过测试来说明测试时的攻速: |
| (可以下载我的测试视频)测试方法还是和前面一样的,通过把伤害值调成固定,根据目标的损血来计算伤害次数,为了凑这个攻速我更换了一些装备,不暴伤害变成213 暴击362,结果:攻速总伤害暴击次数非暴击次数总次数1.984430414182.014260020202.04455821820按照我以前的想法,在2.01攻速时,跳数=2.01*9=18.09,应该是18或者19跳,实测结果是,当攻速跨过2.00后,直接从18跳突变到了20跳,没有19跳这个过程,这与表格是相符的。说明我以前的想法是错的,表格才是对的。验证了他的正确性后,开始找原因。很多人是从这个帖子看到的这张表: 1.04无限双旋风传奇级攻略 ,基本上每个玩双旋风的玩家都会看过这个帖子,但该贴并没有解释这张表为甚么是这样,只是提到摘自“午夜镇魂曲”的帖子午夜镇魂曲的帖子还是没有解释为甚么,只是提到摘自“蛮子一桶浆糊”的帖子,论坛搜索这个ID,还好他只发过2帖,有提到这张表,但依然没有解释为甚么,也没写转自哪里,于是,线索断了。还好,在浆糊的帖中,我发现他列的这张表中的单位是用英文写的,说明,他很可能是转自国外某网站,并且没有经过修改。在这个贴中,作者终于非常详细对这个表做了解释,原帖是英文的,我简单讲下:D3中有一个最小时间单位:帧,Frame,下文简称F,他的长度是1/60秒,每一秒游戏固定由60个F组成,这些不会变。 作为最小时间单位,他不可分割,不会出现0.5F这种东西。D3中的各种动作,都会占用一段时间,由于F是最小单位且不可分割,各种动作占用的时间就必须是F的整数倍,一个动作可以占用10F的时间,如果要快一点,他要么变成9F,要么变成8F,无法变成8.5或者9.875F这种。冲刺的小旋风的每一跳也是一个动作,他也会占用一定的时间,这个时间一定是F的整数倍,即NF,N是整数。一个小旋风持续3秒,3秒=180F,每一跳的时间是NF,那么3秒内的跳数=180F/NF=180/N,由于N必须是整数,当他等于9的时候,180/9=20,当他等于10的时候,180 /10=18。这就是为甚么不会有19跳的原因,因为小旋风一跳的时常要么是9F,要么是10F,无法是中间的某个值。同理,我们可以算出当N等于 1,2,3...时的跳数,都是180/N。比如在某个攻速下小旋风每跳的时间是5F,那么3秒就有180/5=36跳。N的取值是怎么确定的呢,是由攻速决定的。N与攻速的关系是怎样的呢?在前面我的错误设想里有提到过,我认为跳数=攻速*9,实际上这个想法在理论上是正确的,或者可以说是设计师的本意。我们还刚推出了,跳数=180/N,于是180/N=攻速*9,N=20/攻速。造成我的想法产生偏差的原因,是因为F已经是最小时间单位,无法再分割,于是N必须是整数,当用某个攻速比如2.1,代进去得到的N不是整数,20/2.1=9.524。然后用一个不是整数的N去计算跳数,自然也就得不出正确的跳数,因为实际上不存在9.524F,要么9F,要么10F。当在指定攻速下算出来的N不是整数时,N会向下取整。道理是这样的:比如2.0攻速时N=10,当你的攻速比2.0快一些的时候,必须快到足以使N 变成下一个整数才有用,否则没变化。下个整数是9,对应的攻速是20/9=2.22222,如果你的攻速比2.0高,比如2.1,但每达到2.2222,那小旋风每跳的时间消耗就降不到9F,还是10F。2.1时每跳的帧数就是用20/2.1=9.52,向下取整变成9得到的,跳数就是用180/=20得到的,这就是这张表的产生方式。掌握了这个原理后,即使找不到这个表格,我们也能自己算出各个攻速临界点,这些临界点就是使20/攻速等于整数的点。对应的攻速和跳数分别为:帧数 & 攻速 & & & & 跳数5 & & 20/5=4.00 & &180/5=366 & & 20/6=3.33 & &180/6=307 & & 20/7=3.86 & &180/7=26.......15 & &20/15=1.33 & 180/15=12.....等等,依次可以自己计算,我就不贴全表了,需要的可以去原帖查阅,我觉得自己学会算更好,可以帮助理解,或者发现一些错误,比如前面贴的那一段表中最后一行的30跳就有问题,不是2.98035,应该是3.3333。 运用前面的知识,要30跳,意味着N=180/30=6,即小旋风每跳的时间是6F。N=6时的攻速节点应该是20/6=3.3333.N=7时的节点是 20/7=2.857,所以最后一行应该是2.857-3.333,在国外的原帖中,这已经修改了。这并不是小旋风的特例,很多一次攻击被分成若干次来判定的技能都是这个原理,比如DH的连射等。关于冲刺小旋风跳数与攻速的关系就说到这里这部分不是重点,我讲这些主要是为了通过这个大家都比较熟悉的东西引出Frame(F)这个概念,然后再看看这种原理是否对其他更多的技能有效。四 关于Frame D3中最小的时间单位称为一个Frame(帧,F),一秒=60F,1F=1/60秒,F不可分割。先说一下他与我们平时说的帧数的区别。不管你的CPU,显卡等等性能如何,游戏总是固定的每秒生成60F。他与我们平时说的玩XX游戏多少帧比如在游戏里按CTRL看到的数字(我称他f,或者fps)不是一个概念,F是游戏生成的次数,f是显卡捕捉到的次数。F是恒定的,只要是玩D3就是一秒 60F,不会变;f是变化的,他取决于电脑性能。我们平时只能通过显示器来看游戏,所以在感官上我们只认识f,但真正在背后决定游戏运行方式,动作长短的,是F.打个比方,F是一个隐形人在跳绳,稳定的一分钟跳60下,f是拿着一个能拍到隐形人的相机在对他拍照,我们看不到隐形人但能看到照片。相机可以拍的快或慢,f的数值也就可以变化,可以一分钟拍120张,也可以一分钟拍15张,但不管拍到几张,这个隐形人实际总是每分钟在跳60下这与相机是无关的。F 是固定的。f高,只是不会错过他的某一跳,f低,比如只有15,就会漏掉很多跳没拍到,这样看上去动作就不连贯,就是所谓的卡。本文中一直会说到的1F,代表的不是一个画面,代表的是1/60秒的时间,他是一个时间计量单位。比如我说一下猛击8帧,意思不是他需要8个画面,意思是他需要8*1/60秒的时间。 我在这里引入了Frame这个概念,其实他对一个D2老玩家来说并不新鲜,这个系统不是在D3开始的,在D2时就有了,并且是大多数D2玩家所熟知的,因为当时所有的配装核心就是围绕F。这里顺便多说一些D2中的Frame,因为我不确定D3中是怎样,但很确定D2里是怎样,通过描述他在D2中的运作方式看看这套机制是否能搬到D3中。D2的1秒是由25个F构成,1F=1/25秒。他的工作方式是这样的:一个动作固定会占用一定的时间,这断时间必须是F的整数倍。动作会有很多种,比如攻击,施法,格挡,硬直,都是不同种类的动作。会有专门的属性来加快动作的频率,缩短每次动作的时间,比如快速攻击(IAS),快速施法(FCR),快速格挡(FBR),快速打击恢复(FHR)等等。可惜的是,在D3中,这套系统已经被极度简化了,施法和攻击合并了,格挡不需要时间不是动作了,硬直被取消了。只剩攻击这一个动作和攻速这一个属性。(这些东西可以参考凯恩百科中breakpoint这个词条)动作之间是一个序列的关系,不能同时做几个动作,必须做完一个再做下一个。想在单位时间内做更多动作,唯一的办法就是缩短每次动作的时间。动作的时间缩短是跳跃的,只能从N*F变成(N-1)F,没有中间量,这也就决定了用来改变动作时间的属性比如IAS,FCR这些,也只能是跳跃的,要使一个动作减少1F,必须堆积一定量的属性,不够量,则无效。在D2中,由于没有面板攻速可以看,所以人们谈论速度问题时,更多的是直接说F,&你的亚马逊攻速是多少? & &10F&。这在当时的交流中是非常常见的,没有人会说X.XX。10F这代表射一箭,从抬手到射出去,到手放下来这个完整动作,需要10个F的时间,D2中一秒是25F,那一秒就可以射25/10=2.5箭,相当于现在的2.5攻速。如果你想提高攻击频率,可以增加IAS属性的数值,使他达到 9F。不同的武器需要的数值不一样,比如九头蛇弓(风之力),基础攻速是15F,要达到10F需要60ias,9F需要90ias,如果你现在是 60ias 10F,要提高到9F需要再堆30ias,如果达不到90。那么75也好,80也好,都没用的,和60完全一样,还是10F。D2是这样,我现在关心的是D3是否也这样,前面我们已经通过小旋风攻速跳数对应关系表说明了Frame机制在D3中是存在的,至少对小旋风这个技能是适用的,那么接下去要看看这个机制是否对其他技能全面适用,比如猛击,因为猛击适用的话,那么可以想象很多技能,先祖啊甚么的,应该就都适用。五 提出假想 我先假设猛击也和D2中的一次攻击一样,他从抬手到伤害判定,到手放下来这一个周期我称他为一个动作,在引入Frame的概念后,动作周期我不再用秒来表述,全都用F,因为F是最小单位不可分割,所以一个动作的长度必须是整数个F。假设一次猛击需要60F,一秒有60F的时间,意味着一秒可以打60/60=1下,即攻速=1.0假设一次猛击需要30F,一秒可以打60/30=2下,即攻速=2.0以此类推,我们可以得出,当单次猛击耗时等于不同的F时,需要的对应攻速是多少。做出一张单次猛击攻击动作时间,与攻速的对应表:帧数攻速1分钟攻击次数帧数攻速1分钟攻击次数601.000 60.00 302.000 120.00 591.017 61.02 292.069 124.14 581.034 62.07 282.143 128.57 571.053 63.16 272.222 133.33 561.071 64.29 262.308 138.46 551.091 65.45 252.400 144.00 541.111 66.67 242.500 150.00 531.132 67.92 232.609 156.52 521.154 69.23 222.727 163.64 511.176 70.59 212.857 171.43 501.200 72.00 203.000 180.00 491.224 73.47 193.158 189.47 481.250 75.00 183.333 200.00 471.277 76.60 173.529 211.76 461.304 78.26 163.750 225.00 451.333 80.00 154.000 240.00 441.364 81.82 144.286 257.14 431.395 83.72 134.615 276.92 421.429 85.71 125.000 300.00 411.463 87.80 115.455 327.27 401.500 90.00 106.000 360.00 391.538 92.31 96.667 400.00 381.579 94.74 87.500 450.00 371.622 97.30 78.571 514.29 361.667 100.00 610.000 600.00 351.714 102.86 512.000 720.00 341.765 105.88 415.000 900.00 331.818 109.09 320.000 1200.00 321.875 112.50 230.000 1800.00 311.935 116.13 160.000 3600.00 这个表是有偏差的,后文会再修正,不用在意他的具体数值是否精确,我们主要是看他的规律。我的假想是,直接决定单位时间内攻击次数的,是每次猛击的帧数,先借用这张不太准确的表里的数据打比方。 1分钟有3600F,如果一次猛击NF,攻击次数就=3600/N。比如一次猛击的时间是31F,那1分钟就打出116下,想再快一点,猛击的耗时只能从31F降到30F,那就打出120下,不管我们怎么微调攻速,打不出118下,就像小旋风不会有19跳一样。 虽然我们可以搭配出很多很多种攻速,100个蛮子有100种攻速,但他们站着打10分钟,打出的攻击次数只会有60种。我们通常认为直接决定单位时间攻击次数的就是攻速,两者是联动的,攻速*时间就是次数。但在这个假设中,不是这样。攻速不是直接决定攻击次数,根据这个表,如果攻速从1.90提高到1.92,只要不超过1.935,每次猛击还是32F,每分钟还是112.5下,没有变化,多0.02的攻速不会使你在 60秒内多打1.2下。 攻速直接影响的是每次猛击的耗时,攻速的改变必须达到一定的量,超过某个具体数值,使得每次猛击的帧数发生了变化,单位时间的攻击次数才会发生变化。我称这些需要达到的具体数值为断点,或者阀值。这就能解释第一个对比测试中,先加2%攻速多了27次,再加2%攻速完全无变化这个现象了。因为第一个2%攻速正好使得攻速越过了断点,1次猛击的帧数减少了1F,而第二个2%攻速的提升没有越过断点,帧数没有改变,攻击次数就不会有改变,不管是打5分钟还是10分钟,平均每分钟的攻击次数都不会有变化。如果这个假设是成立的,那么我们平时选择装备时,在考虑要不要花钱去多买1% 2% 3%攻速时,就需要考虑下这个提升能不能使你的攻速越过断点,如果越不过,就没任何变化,这个钱就是白花的。如果能越过断点,那么这个提升就是有意义的,有价值的。六 更多测试数据 为了验证这个假设,单靠一组对比测试是不够的,我还做了一些测试。攻速伤害暴击非暴击1分总次数 1159401095105 1201561099109 1196291197108 2275808116124 23495714110124 23829311117128 56360912167179 56782014165179 5488705174179 62111718168186 61083015171186 603972131731862.250 156499179609688/5=137.42.280 162036678637715/5=1432.310 155553234681715/5=143蓝色攻速的这些都是新做的,2.2X那组是前面已经贴过的,放一起,方便看看数值。如果想验证准确性点攻速可以下载测试视频。为了降低一些测试量(5分钟的话从录,到截,到数,一条数据需要大概20分钟时间,太久了),每条数据我都只测了1分钟。 测试方法还是一样的,按住鼠标猛击打罪恶之心。每个视频的开头我会开一下面板,可以看到我的攻速和爆伤,暴击的数值会在屏幕上直接显示,非暴击的数值可以根据爆伤算出来,然后根据结束时目标的血量和数出来的暴击次数,算出非暴击次数,相加得到总次数。 误差前面说过,最多不会超过1次。每3条数据为一组,每一组里,我穿的装备,除了左戒,其他都一样,通过替换左戒,来得到3个临近的攻速,左戒就是前面贴过的3个,攻速分别为5 7 9,他们附带的最小值都一样,都不带力量和爆伤,所以在同一组测试里,换左戒不会影响打出来的数字大小。通过这些测试的结果,主要看到两个现象:1)这些实测出来的攻击次数,在我前面推导出来的帧数-攻速-攻击次数表里都有出现,至少是近似值,105 109(108可能是误差) 124 128 179,137 143 都有近似值。186差的比较多,这个后面再说。这些攻速是我随便取的,穿一件暮光,得到一组,再穿一个巫异,得到一组,主手匕首1.5换成1.8的,再得到一组,这样得到的,不是根据表刻意凑的。所以得到的这些实测值与推测值很近似,这应该不是个巧合。2)每组3条数据,都是差2%攻速,每多2%攻速,可能会改变攻击次数,也可能完全没变化。这两个现象说明,我的假设基本可以认为是成立的:Frame这个机制在D3中确实存在,不光是作用在冲刺尾气上,对猛击这样的普通攻击技能也有效。攻速的提升需要达到一定量变,才会引发单次动作帧数的改变,从而引发单位时间攻击次数的改变,这一条通过这些数据应该可以得到确认了。 七 对表进一步修正 前面我们推出了帧数-攻速-攻击次数表,并收集了一些数据,但仔细将这些数据与表对照,是有问题的,主要是2个:1)比如2.01攻速应该是30F,1分钟120下,实测是124下,也就是实测打击数多余预测。2)比如1.98和2.01攻速没有发生变化都是124,变化发生在2.01个和2.04之间,变成了128,但根据这个表,断点应该是2.00整,变化应该发生在1.98和2.01之间才对。前面在做小旋风测试的时候,断点也确实是发生在2.00,他就没这问题。发现了这两个问题后,我又做了一个更直观的测试。1.00攻速,打5分钟,结果:攻速总伤害暴击次数非暴击次数5分总次数每分次数 21538022288310621.0攻速5分钟打出了310次,每分钟62次,这很奇怪,用传统的想法,攻速1.0么一分钟应该60次,解释不了;用我的理论,1.0攻速正好是 60F的断点,达到1.0就应该意味着每次猛击的时间是60F,一分钟3600F,应该也是正好60次才对,即使1.0是算作59F,那根据表也应该是 61次/分,还是解释不了。其实这个现象我已经不止一次的看到有人提出过了,因为这很容易观察到,打2分钟,发现打出来的次数比120多,或者打120下,发现用时不到120秒,即使用更粗糙目测+秒表,这个现象也很明显。接下来我试图对这个现象进行解释。 前面写的东西,都是客观的,但从这里开始,已经既没有官方的结论,也没有D2的经验可供参考,完全是我的主观推测,伴随着各种假设,以及去分析假设靠不靠谱,所以不要认为我接下去说的都一定是对的,很可能完全不是这么回事儿。如果你对这些不是很确定的东西不感兴趣,那么读到这里就可以结束了,截止第六段已经可以说明一些问题。 愿意读下去的人,可以帮我一起把遗留的问题解决。为了解释1.0攻速1分钟打出62次这个现象,我做了两种假设:1)1秒不是由精确的60F构成的,可能是62,或者说1F的时间不是精确的1/60秒,可能是1/62秒。一秒62F,1分钟3720F,一次攻击60F,那就会有62次。2)依然是1秒钟精确的60F,这不变,但由于某种原因,在攻击过程中,一个完整的攻击动作中的某几个F被吃掉了,一个本需要60F时间完成的猛击动作,只用了58F的时间就打完了,一分钟还是3600F,每击只花了58F,就有62次。以上两种假设都是有可能的,我个人比较偏向于第二种假设一:我觉得这种假设可能性不大的原因有两个,一是因为现在的技术要做到准确的一秒60F并不难,二是经过一些研究,我觉得1F确实是1/60秒,回到前面尾气测试时贴的2.01 2.04这两个攻速的视频,我用他们来找1F的时间长。在尾气测试中,我们知道尾气无论是断点的位置,还是在某个F值时的跳数,都是与理论计算出的表格完全符合的,他并没有猛击这样断点位置和攻击次数发生偏离的问题。他没有发生问题,我的猜测是因为连续猛击是由若干个独立的动作拼接而成的,在拼接的过程中可能会出问题,而一次小旋风的若干跳,他们是一个不可分割的整体,是一次成型的,所以我觉得去观察小旋风是靠谱的。在2.01 2.04尾气这两个视频中,我保留了白字没有关闭,用来观察F的长度。视频的采样率是60,也就是视频里的一秒是由60张画面组成的,每张画面长1/60 秒,如果游戏中的1F确实是1/60秒的话,视频里每一副画面的时间长短就应该与1F相等,虽然他的生成节奏可能和F不同步,但时长是一致的。两个视频我都采用逐画格播放,按一下键盘,放一格,来观察到底用了多少格画面,即多少个1/60秒来完成这些跳。在这两个攻速时,小旋风每跳都是9F,总共都应该是20跳。攻击动作都会有前摇,判定,后摆的过程,由于小旋风一直是那个样子,我看不清的前摇从哪里开始后摆到哪里结束,就只能从判定点来看,于是从第一次产生伤害,到最后一次产生伤害,这样去掉了第一跳的前摇,和最后一跳的后摆,总共就是19跳的时间,应该是9*19=171F。如果1F的长度确实等于1/60秒,那么这断时间也应该有171个画格,至少比较接近。观察下来的结果是:2.01的视频中,第一跳从6分第8格开始,9分01格结束,一共173格2.04的视频中,第一跳从5分第11格开始,8分01格结束,一共170格。如果像假设一中说的,一秒有62F,每跳应该是9/62秒,19跳应该是19*9/62秒=19*9*60/62格=165格。显然170和173还是更接近于171而不是165. 所以通过这个研究我觉得1F的时间应该就是1/60秒整,他不会被挤压。假设二:既然研究表明1F应该就是1/60秒没问题,那么可能性就更倾向于假设二了,一个攻击动作的某几个F被吃掉了。为甚么会这样,前面已经有提到,因为我们在按住鼠标连续攻击时,这些攻击是有若干个动作连接形成的动作序列,你单独打一下猛击就停,根据攻速,他应该耗时比如20F,这没问题,但当按住鼠标连续打很多个猛击的时候,比如按住鼠标让他打10下,就不是200个F,某些F被吃掉了或者说丢失了,变成了可能190F,于是只需要比原来更短的时间就能打完。为甚么会这样,我说不出绝对正确的理由,只能继续假设。好吧,在假设里还要做假设。。。接下来假设为甚么某些F会丢失,是怎么丢失的。假设三:当你按住鼠标,等于不停的在向游戏发出攻击的指令,也就是你发送的比他执行的快,游戏受到这些来不及执行的指令时,生成一个指令序列,动作 1连着动作2连着动作3这样,在链接的过程中,发生了损耗,就好比你要把一些断掉的细纸条链接起来,你需要在每一条的末尾涂一些胶水,把后一条粘上来,这样就使断裂的纸条产生了连贯性,当然问题就是每一个纸条比原来短了一点,因为涂胶水的部分被后一条覆盖了。 既要把纸条连接起来,又不能损失一丝长度,现实中是做不到的。所以我猜测在游戏中,为了保证动作的连续性,也可能损失一点长度。为甚么尾气没有问题,因为他是作用在怪身上的,你仍出去一个尾气,接下来他就是自己运作,与你本身不构成动作序列的关系,于是就不需要拼接,就没问题。如果确实是这样的话,那本来一个10F的猛击,会变成9F,或者8F,一个60F的猛击会变成59F或者58F。等于每个攻速对应的F值会比表中低 1-2,这个看起来还算有点味道,比如测试中的1.74攻速 109跳,本来1.74攻速应该对应1.71的35F,给他减2F变成33F后,正好对应109次。但这个假设还是有问题,你会发现,测试数据中,某些攻速需要-1F来看表,而有些又是需要-2F,这个无法解释。还有,降1-2个F看表不会改变表上的那些数字,这样依然无法解释为甚么会出现186次,这个数值。总之这个假设感觉还是不太对,我觉得是因为我把F丢失的方式想的太简单了,确实,一款2012年的游戏,动作序列的连接,做的像连纸条这么简单,也是稍微扯淡了点。。。有必要把他想的再复杂一些。假设四:我尝试来设计一套更复杂连接方式。 根据平时的游戏经验,我想到一个东西,半秒,有些东西以半秒为单位来显示,比如回血绿字,半秒一跳,他就像是一个结算周期,是一个比F更大的时间单位,之后我称一个半秒为1U。现实中,我们用毫秒,秒,分等单位来衡量时间,而游戏系统内,是以F和U为单位来计算时间,拍一巴掌需要几F,拍死一只怪需要几U,应该这样来说。按理说1秒=60F,半秒应该是30F,但我要假设的是1U=31F,也就是1U实际比半秒长一点点=31/60秒,1F还是稳定的1/60秒。为甚么我假设1U=31F,31这个数字,对编程来说也是有一定特殊性的。编程时经常会去用一些2的整数次方的数字,比如2^5=32。所以我会准备一个32个格子的容器U去存放F,并且编程中我们知道,各种容器,数组啊,集合啊,等等,格子的编号都是从0开始的,第一格编号是U[0],第二格是 U[1],依次。为了方便,很可能第一格留空,如果从第一格开始放,会变成U[N]里放的是第N+1个单位,后续调用很麻烦,从第二格开始放,这样格子的编号与单位的编号就一致了,比如编号是U[N]的格子放第N个单位,会比较比方便。这样一共32个格子,第一格空掉,使用的就是从U[1]到U[31]这 31个格子,U[0]空着不用。说这些东西只是我想说明以1U=31F来作为一个游戏内时间计量单位,以一个32格的容器来制作U,这些在编程时的可能性是有的。回到动作序列的连接,在假设三中我提出直接把各个动作连起来,这种方式不光是过于简单,而且实现上会受更多其他因素的干扰,因为每个动作的时间太短了只有几F,也许会受网络等因素干扰。相比之下,1U是一个比较长的时间单位,受影响的机会要小的多,所以更好的方式是,先把将要执行的每个动作放进一个更大的大容器U里,然后再去连接这些U。就像先把东西装进车厢,然后连接车厢变成火车。如果一3个动作是10F 10F 11F,正好放进一个U里,如果一个动作比较长,比如有40F,那么前31F放在第一个U1里,后9F放在U2里,这样。当我们给游戏发送连续的游戏指令时,比如按住鼠标说攻击攻击攻击,就生成了动作序列,序列生成的方式就是一个U接一个U这样拼上去。拼U的人并不关心U里装的是甚么,他只管把1个个U拼起来并且保证一秒正好由2个U组成,由于每个U的长度是32格(第一格空着,二到最后一格存放这动作内容),直接拼时间会凑不拢,于是,这个拼接工把每个U去头去尾,变成30格即30F的长度,组装,就正好是整数秒了。去头没关系,头本来就是空的,去尾就有问题了,这里是存着东西的,但没办法,这一格里的F就被吃掉了,丢失了。每秒由2U拼接成,每U丢失了1F,这样,等于每秒会丢失2F。这2个U里原本装着62个F,其中第31F和第62F在拼接时被吃掉了。这样的话,游戏用1秒60F的时间,就能完成了62个F的动作,因为其中2F被吃掉了,不用表现了,这便是假设4得出的结论。看上去和假设一有点像,都提到了62F,但是不一样的。假设一里的一秒62F,是在1秒里确实装了62个F,每个F的时间被挤压了,假设四里的1秒62F,每个F的时间还是 1/60秒,没被挤压,只是有2个F丢失了,1秒里装的还是60个F。造成这个问题的原因,我觉得是程序制作时的一个失误,设计者肯定是希望1.0攻速打一分钟出现60次攻击的,现在出现62次肯定不是他故意为之。在 1个U里,如果只储存30个F,头尾都空掉,就没问题了,拼接的时候去头去尾正好去掉两个空格,设计初衷应该是这样,但可能在实现时的忽略,把最后一格也存了一F,问题就发生了。其实平时编程时,诸如搞错数组序号这种事是很常见的错误,也没甚么稀奇。根据假设四,1分钟60秒,能够用来完成60*62=3720F的动作,当然实际的时长还是3600F,能在3600F完成3720F的动作,因为 120个F在拼接时丢失了。也就是说,如果一个动作需要20F的时间,在假设四这样的机制下,1分钟能完成次。Oyeah,我很欣喜的发现我得到了186这个之间无法解释的数字。 同理,用3720/不同的帧数,就能得到在这个帧数下1分钟的攻击次数,于是我们得到一张修正表。帧数攻速理论每分次数修正次数帧数攻速理论每分次数修正次数601.000 60.00 62.00 302.000 120.00 124.00 591.017 61.02 63.05 292.069 124.14 128.28 581.034 62.07 64.14 282.143 128.57 132.86 571.053 63.16 65.26 272.222 133.33 137.78 561.071 64.29 66.43 262.308 138.46 143.08 551.091 65.45 67.64 252.400 144.00 148.80 541.111 66.67 68.89 242.500 150.00 155.00 531.132 67.92 70.19 232.609 156.52 161.74 521.154 69.23 71.54 222.727 163.64 169.09 511.176 70.59 72.94 212.857 171.43 177.14 501.200 72.00 74.40 203.000 180.00 186.00 491.224 73.47 75.92 193.158 189.47 195.79 481.250 75.00 77.50 183.333 200.00 206.67 471.277 76.60 79.15 173.529 211.76 218.82 461.304 78.26 80.87 163.750 225.00 232.50 451.333 80.00 82.67 154.000 240.00 248.00 441.364 81.82 84.55 144.286 257.14 265.71 431.395 83.72 86.51 134.615 276.92 286.15 421.429 85.71 88.57 125.000 300.00 310.00 411.463 87.80 90.73 115.455 327.27 338.18 401.500 90.00 93.00 106.000 360.00 372.00 391.538 92.31 95.38 96.667 400.00 413.33 381.579 94.74 97.89 87.500 450.00 465.00 371.622 97.30 100.5478.571 514.29 531.43 361.667 100.00103.33610.000600.00 620.00 351.714 102.86106.29512.000720.00 744.00 341.765 105.88109.41415.000900.00 930.00 331.818 109.09112.73320.0001200.001240.00 321.875 112.50116.25230.0001800.001860.00 311.935 116.13120.00160.0003600.003720.00 这张表看起来就比较靠谱了。与前面的一些测试结果差异也很小(我是指跳数上的差异比较小,断点位置的差异还是有的,这个下一步再解决)再做一个测试来说明假设四比假设三更靠谱,通过表的走势可以看到,随着攻速的提升,攻击次数的变化也就跨度就越大,要验证哪一种假设更靠谱,比较好的办法是制造一个高攻速,看看他的攻击次数更接近哪种假设。我做了3.816攻速,双持2把1.8速度的匕首,穿除了旧祖鞋外所有的满值攻速装,加变身。结果:攻速总伤害暴击次数非暴击次数总次数 80704731202233(两把匕首的最小值是一样的,所以在饰品的最小值属性加成后,主副手的DPH一样,打出的数字一样,还是可以用同样的办法来统计攻击次数)1分钟233次,这个数字在修正后的每分次数中可以找到,对应16F 3.750攻速的232.5次。而在原来的理论次数中,没有与之对应的数值225 240都差的很远,按照假设三的少看1-2个F去找,找不到,说明假设三不靠谱。最后的这个高攻速测试应该可以表明,我的假设四还是有点谱的,毕竟在高攻速下,攻击次数的跳跃幅度是很大的,根据假设的修正能与实测很接近,应该不是巧合了。八 遗留的问题和结论 最后通过假设四我依然没有解决的问题是,为甚么断点不是出现在60/N这些位置。这个很遗憾,这也是我长篇大论的主要原因,我想让看的人了解我的想法,帮我想想为甚么断点会偏移,偏移到哪去了。我不想用大量的实测去逐个逼出断点的位置,这样还是搞不清为甚么,肯定是有某个原因在里面的,还是先想出原因,算出理论值,再用实测去验证比较好。更新,我暂时找清出断点位置,可以作为一个初步结论,还是比较准确的,可以作为参考,这张表适用于猛击,先祖:帧数每分钟攻击次数攻速帧数每分钟攻击次数攻速6062.00 0.983 30124.00 1.967 5963.05 1.000 29128.28 2.034 5864.14 1.017 28132.86 2.107 5765.26 1.035 27137.78 2.185 5666.43 1.054 26143.08 2.269 5567.64 1.073 25148.80 2.360 5468.89 1.093 24155.00 2.458 5370.19 1.113 23161.74 2.565 5271.54 1.135 22169.09 2.682 5172.94 1.157 21177.14 2.810 5074.40 1.180 20186.00 2.950 4975.92 1.204 19195.79 3.105 4877.50 1.229 18206.67 3.278 4779.15 1.255 17218.82 3.471 4680.87 1.283 16232.50 3.688 4582.67 1.311 15248.00 3.933 4484.55 1.341 14265.71 4.214 4386.51 1.372 13286.15 4.538 4288.57 1.405 12310.00 4.917 4190.73 1.439 11338.18 5.364 4093.00 1.475 10372.00 5.900 3995.38 1.513 9413.33 6.556 3897.89 1.553 8465.00 7.375 37100.54 1.595 7531.43 8.429 36103.33 1.639 6620.00 9.833 35106.29 1.686 5744.00 11.800 34109.41 1.735 4930.00 14.750 33112.73 1.788 31240.00 19.667 32116.25 1.844 21860.00 29.500 31120.00 1.903 13720.00 59.000 如果你的攻速达不到下一档,那就只有上一档的攻击次数,比如攻速是1.98,没有达到会突变的2.034,那实际就只有1.967的攻速,1分钟只能打出124下。 九 现实意义最现实的就是前言里提到的,有没有去多追求一点攻速的必要。因为现在这个阶段,很多人身上的属性已经比较饱和了,白多一个词缀的空间几乎不存在了,剩下的就是去把一些数值做饱满。 攻速必须达到一定量变,才会引起攻击次数增加或者战斗时间缩短的质变。在追求装备上攻速属性饱满的时候要付出高昂的物质代价,那么就很有必要认真考虑下有没有回报。从实测数据可以看出,当攻速比较高时,让每次攻击减少1F需要提升的攻速相当多,从2.8X和3.0X那两组数据都是换了两次戒指提升了4%的攻速,都没产生差别,4%不是一个小数目,全身殷娜,巫异,暮光,拉库尼都买8速和都买9速价钱差的可不少。从表的走势也可以看出,当攻速在2.5往上时(这个数值对变身后的双持蛮子不难达到),每降1F,需要的攻速提升已经超过了0.1,我们武器的基础速度一般也就是1.X,比如BUG锤双持,主手也是锤的话,基础速度只有1.45,1%攻速的提升只能提高0.0145的攻速,要累积超过0.1越过下一个短点,需要7%-8%的攻速,这就不是暮光头选8速还是9速的问题了,这得多穿一件攻速装才有用, 这就得完全改变配装计划。由于高攻速时,每降1F需要的攻速非常多,多1%-2%攻速完全无变化的可能性其实蛮大的。如果你现在正在追求自己整体配装的平衡,不妨考虑一下这个问题,如果你的攻速差很少就能达到下一个断点,非常有必要去把这些攻速做出来,如果再多个3%-5%攻速也还不会越过断点,那还是先转去把别的属性属性。由于后续发现不同的技能,断点位置不一样,所以在确定自己需要多少攻速的时候,最好根据自己的build所用的技能,找出一个合适的点。蛮子常用攻击技能很少,先祖占了绝大部分吧。基本把先祖表和尾气表结合起来看下就行了。其实如果你有能力都用满速的,其实根本不用纠结这些东西,毕竟是大于等于的关系,多了最多是不生效,反正也没负作用。我研究这些,主要是给暂时无法把攻速做满的人一些参考。比如我的项链:项链因为我自己是不朽套的,能做攻速的位置很少,于是我一直很在意有限那几个部位上的攻速,别的属性我可以其他地方找,攻速找不出来。这个项链我一直不太满意,主要是攻速只有7,我已经做了很多很多了,攻速不是9就无视。现在基于这个理论,我可以重新审视下有没有必要再继续去试图挖掘那2%攻速了,然后发现,确实没必要了,我现在主副手攻速是1.98 2.14,正好刚跨过1.967 和2.107这两个断点,如果多2%攻速,会变成2.0和2.17还是没跨过一下个断点2.034和2.185。 所以,我可以不用再折腾这玩意儿了。十 理论意义通过这次研究,不管你用什么技能,不管什么攻速,不管我说的对不对,反正有一点很清楚:实际单位时间打出来的次数都会比(攻速*时间)的这个预期值多。而以往我们的各种理论,比如维持变身啊甚么,都是基于攻速*时间在考虑的,这也许就会有点问题,不过以后慢慢再说吧。后续我又采集了一些猛击的数据,基本已经确定了断点位置,表格在第八部分已经作为结论更新,并且做了先祖的测试,先祖和猛击是一样的。本来从一开始我就是想用先祖做测试的,毕竟这才是常用技能,但我怕做不到绝对的无限先祖引起误差所以改用了猛击。而且之前一直局限在暴击回怒的圈子里,我觉得即使无限了,会有很多很多暴击,我会数不清楚。经bigrock一句话提醒,我想到了,实验制造无限先祖不一定要用暴击回怒,可以靠减怒气消耗来实现。我没有那么多减先祖装备,但我想到了“奋战不懈”这个被动,生命低于20%,怒气消耗降低75%,然后我随便找个怪把我打红,带一件-5的装备,就绝对无限了。于是可以用先祖继续测试。下面是猛击和先祖最后测试数据,因为是一样的,就放在一起了:攻速1分次数攻速1分次数1.710 1052.341431.740 1092.37121491.770 1082.40241491.8451152.3761481.8751152.4121481.9051192.4481481.980 1242.8621792.010 1242.8981792.0401282.9341792.19961373.0241862.23081373.061862.2621363.0961862.250 6882.280 7152.310 715把这些测试结果与最后修正后得出的表比较,还是比较吻合的。篮色高亮的都是在断点边缘的攻速,确实也都符合了规律,所以应该还是比较可靠的。断点的偏移问题,在我用其他技能测试后,受到一些启发,我发现,不同的技能在相同的攻速下,单位时间打出的次数不一样,比如1.0攻速,猛击能打出 62下,飞斧能打出73下,这说明,不同的技能,达到某一个F,需要的攻速不同。要实现这样的效果可能有很多种方式,最简单的一种就是直接在基础标准断点攻速的基础上乘一个系数,相当于给了他一个折扣,使他更容易达到低F值,不同的技能可能会有不同的系数,制作游戏时可以通过修改系数很容易的控制不同技能的快慢。标准断点位置是60/60,60/59,60/58.....依次到60/1,我在这些攻速点上都乘以一个59/60的系数,就得到了现在猛击,先祖修正表的断点位置。当然后续还要再推敲推敲,不过实际数据确实蛮吻合的。如果是飞斧,这个系数大概是51/60.得到的飞斧表是帧数每分次数攻速帧数每分次数攻速6062.00 0.850 30124.00 1.700 5963.05 0.864 29128.28 1.759 5864.14 0.879 28132.86 1.821 5765.26 0.895 27137.78 1.889 5666.43 0.911 26143.08 1.962 5567.64 0.927 25148.80 2.040 5468.89 0.944 24155.00 2.125 5370.19 0.962 23161.74 2.217 5271.54 0.981 22169.09 2.318 5172.94 1.000 21177.14 2.429 5074.40 1.020 20186.00 2.550 4975.92 1.041 19195.79 2.684 4877.50 1.063 18206.67 2.833 4779.15 1.085 17218.82 3.000 4680.87 1.109 16232.50 3.188 4582.67 1.133 15248.00 3.400 4484.55 1.159 14265.71 3.643 4386.51 1.186 13286.15 3.923 4288.57 1.214 12310.00 4.250 4190.73 1.244 11338.18 4.636 4093.00 1.275 10372.00 5.100 3995.38 1.308 9413.33 5.667 3897.89 1.342 8465.00 6.375 37100.54 1.378 7531.43 7.286 36103.33 1.417 6620.00 8.500 35106.29 1.457 5744.00 10.200 34109.41 1.500 4930.00 12.750 33112.73 1.545 31240.00 17.000 32116.25 1.594 21860.00 25.500 31120.00 1.645 13720.00 51.000 粗略测了几组,基本符合,可以看到,同样的攻速,扔飞斧实际的攻击次数要比打猛击多很多。也就是说飞斧这个技能的输出比字面上看上去的高不少最后我所说的很多东西,都是基于假设,测试结果接近也不能说明他就一定是对的,未必可靠,只有官方说的才可靠。所以,要不要信,信多少,各位还是自己把握。
与暗黑3相关的文章有:
精彩图文推荐
文章排行榜
精彩视频推荐}

我要回帖

更多关于 张杰 我们都一样 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信