Skip to content

准确率(Acc)

计算方式

Acc的计算方式比较简单,而且note间独立。

判定准确率
max300300=100%\frac{300}{300}=100\%
300300300=100%\frac{300}{300}=100\%
200200300=66.67%\frac{200}{300}=66.67\%
100100300=33.33%\frac{100}{300}=33.33\%
5050300=16.67%\frac{50}{300}=16.67\%
miss0

将所有note的准确率值平均之后即为最终的准确率。

提示

在本文中,判定的名称单独出现时,使用官方wiki出现的叫法,用max表示彩300,300表示普通300(黄300),但在叙述时依然使用玩家广泛使用的彩300/黄300,下同。

osu!mania判定机制

osu!mania严格的判定是其引以为傲的资本,也是大家如果遇到移动端音游来碰瓷时,可以用来反击的武器(狗头)。下文主要介绍osu!mania的判定机制。

判定区间

这里要提到两个概念:内判定区间和外判定区间:

image-20200510121027995

我们键盘的输入会用于判定结果,也会用于生成回放文件(.osr格式)。由键盘直接输入的判定结果显然应该与回放作为输入时的判定结果相同,否则回放就失去了意义。

因此,我们用内判定区间代指回放文件中记录的按键历史作为输入来判定时的判定区间,也就是osu!程序计算时所用的判定区间(同时也是计算PP时使用的判定区间);用外判定区间代指玩家键盘作为输入时的判定区间,也就是玩家主观感觉到的判定区间(同时也是光标移动到选歌界面左上角的谱面信息的OD值时显示的判定区间)。二者的区别在于,回放文件记录的时间事实上只精确到毫秒,而玩家的输入可以认为是连续值。这二者间的区别会导致一些有趣的结果,我们将在下文介绍。

内判定区间

没有Hardrock(以下简称HR)、Easy(以下简称EZ)或Doubletime/Nightcore(以下简称为DT,不再单独区分NC)、Halftime(HT)这些Mod时,内判定区间的计算方法为:

判定判定区间(毫秒)
max16
30034+3×(10OD)34+3\times(10-\text{OD})
20067+3×(10OD)67+3\times(10-\text{OD})
10097+3×(10OD)97+3\times(10-\text{OD})
50121+3×(10OD)121+3\times(10-\text{OD})
miss158+3×(10OD)158+3\times(10-\text{OD})

提示

miss的”判定“区间这种说法可能看起来有点奇怪。实际上,这个值代表的是可判定区间的起始时间。具体见下文。

以上公式中的10OD10-\mathrm{OD}在实际计算时会限制在[0,10]\left [0,10 \right]之间。因此,即使通过手动修改.osu文件,将OD改为大于10的值或负数,也不会影响判定区间。

从std而来的转谱的判定区间不能使用std模式的OD值套用上表计算,而具有特殊的计算方法:

判定OD>4(毫秒)OD≤4(毫秒)
max1616
3003447
2006777
1009797
50121121
miss158158

有趣的是,因为大多数mania图的OD在7~9左右,实际上转谱的判定反而很多时候比一般谱面严格。不过这没有什么影响,反正根本没有人打转谱。如果你在打的话,请立刻停止这种行为。

开HR时,以上判定区间均变为原来的11.4\frac{1}{1.4};开EZ时,以上判定区间均变为原来的1.4倍。

此外,由于DT/HT的实现机制实际上是改变“时间”的流速[1],而不是改变note出现的时间点。即使你开了DT或HT,得到的回放文件里记录的时间也不会发生变化——回放文件记录时已经把你的按键时间乘以1.5(DT时)或0.75(HT时)了。

因此,为了保证外判定区间不变,开DT时,内判定区间会变为原来的1.5倍,而开HT时会变为原来的0.75倍。这是大家开DT打图时底部的误差条会变得很宽,而开HT时会变得很窄的原因。虽然这实际上不影响游戏,但我个人感觉误差条还是很影响心理状态的,尤其是开HT的时候。

最后,内判定区间会向下取整,得到最终的结果。取整操作会导致以下结果:实际的内判定区间并不是线性变化,而是OD每隔13\frac{1}{3}的阶段性变化;DT和HT也并非完全不影响判定区间。

外判定区间

这里可能有人要问,人们常说彩300判定是16.5毫秒,而上面的判定是16毫秒,这是怎么回事?

刚才我们提到过,回放文件记录时间时只精确到毫秒,玩家实际上的按键时间会被四舍五入取整。因此,只要偏差小于16.5毫秒,取整之后就会被变为16毫秒,判定为彩300。

因此,没有开DT/HT时,外判定区间为内判定区间+0.5\text{内判定区间}+0.5

在开DT或HT时,情况会变得有些复杂。开DT时,玩家的按键输入事件会被乘以1.5,这会影响四舍五入的结果。因此,此时外判定区间为内判定区间+0.51.5\frac{\text{内判定区间}+0.5}{1.5}。同理,开HT时外判定区间会变为内判定区间+0.50.75\frac{\text{内判定区间}+0.5}{0.75}。彩300的判定会分别变为16.33毫秒和16.67毫秒,当然,实际上这点偏差造成的影响微乎其微。

类似EZDT这样的多Mod情况也可以通过以上方式计算。

这个网站是我根据以上的结果做出的判定区间计算器,目前的测试结果均与选歌界面左上角的谱面信息的OD值时显示的判定区间一致。

因为外判定区间实际上是玩家的一种感觉,而不是游戏中实际计算时使用的数值,下文中讨论到的判定区间均为内判定区间,按键数据也以回放文件中记录的取整后的时间为准。

判定方式

可判定范围

可判定范围指一个note可以被判定的时间范围。在没有按键时,一个note的可判定区间如下图所示(从左到右表示时间从早到晚,其中右侧的50和miss判定区间均缺失):

image2

可以看出,虽然miss的判定区间和其它判定区间看起来一样,其实际意义是有本质不同的——它代表一个note的可判定范围的开始

在此时间点之后,note进入可判定状态,且被默认赋予miss的判定结果。

之后如果有按键,该note将被视为已经按过了,可判定状态结束,若按键的时间在彩300~50的判定区间内的话,这个note的判定结果将变为彩300~50。而如果按键时间过早,超出50的判定区间,则这个note的可判定状态也会结束,判定为miss。因此,在mania中,过早按键可能导致note直接miss。

若note之后的100判定区间结束时,仍然没有按键,则这个note也会结束可判定状态,判定结果为miss(即漏键)。因此,miss和50的判定区间为单向的,只有过早而没有过晚。

滑条(长note)的可判定范围可以理解为把上面普通note的可判定范围剪开,分别黏在滑条头和尾处[2]。但滑条内部的判定方式则有所不同,具体见下文。

普通note

普通note的判定方式比较简单。如上文所述,处于可判定状态的note,若满足

按键时间note时间判定区间\left|\text{按键时间}-\text{note时间}\right|\leqslant\text{判定区间}

则判定结果为对应的判定。

滑条(长note)

滑条的判定颇为复杂,下文的介绍中我会穿插一些注解。

在滑条的可判定范围内部,一个滑条可以被按很多次,每次按键结束时判定一次,记录这次按键的开始和结束时间。如果有多次按键,后面的按键将覆盖前面按键记录的开始和结束时间。

提示

因此,最后用于结算的是最后一次按键的时间。

若某次按键结束时间位于滑条尾之前的50判定区间之前,则这个滑条被视为中间断开了,但之后可以再次按键。

否则,若按键结束时间在滑条尾之前的50判定区间之后,则进入结算状态,以刚才的那次按键来计算判定结果,同时滑条的可判定状态结束。

在结算状态,首先,若按键结束时间在滑条尾之前的50判定区间之前,则滑条判定结果为miss。否则,

滑条头误差=按键开始时间滑条头时间滑条尾误差=按键结束时间滑条尾时间\begin{gathered} \text{滑条头误差}=\left|\text{按键开始时间}-\text{滑条头时间}\right|\\\text{滑条尾误差}=\left|\text{按键结束时间}-\text{滑条尾时间}\right| \end{gathered} 滑条头误差判定区间×头判定倍数滑条头误差+滑条尾误差判定区间×尾判定倍数\begin{gathered} \text{若}\hspace{6.75em}\text{滑条头误差}\leqslant\text{判定区间}\times\text{头判定倍数}\\\text{且}\quad\text{滑条头误差} + \text{滑条尾误差}\leqslant\text{判定区间}\times\text{尾判定倍数} \end{gathered}

则判定结果为对应的判定。由下表可见,滑条头的判定最大变宽为原来的1.2倍,而滑条尾的判定最大可变宽2.4倍。这与smoogipoo在论坛中提到的情况一致。

判定头判定倍数尾判定倍数
max1.22.4
3001.12.2
20012
10012

若在100的判定区间之外,则判定为50。

若滑条中间存在中断,且通过上面方法得到的判定结果为彩或黄300,则判定结果为200。

提示

有人会说滑条拉断了不是会直接50吗?实际上,上文我们提到过,滑条的判定以这个滑条的最后一次按键为准,所以拉断的滑条之所以一般会得到50,不是因为中间断过,而是因为拉断之后的那次按键的开始时间距离滑条的开始时间往往相差甚远;但如果是下面的情况:滑条刚开始按就断了,然后立马又按下去,这个第二次按键的开始仍然在滑条头附近,则可能出现”不考虑上一次按键的话,整个滑条判定结果依然是100、200甚至彩或黄300“的情况。

上面提到的特殊规则处理的就是这种情况:只要滑条断过,就最高只能获得200的判定。

讲到这里也许有人会产生这样的想法:如果滑条按的太早了,这时候赶紧松开再按,虽然会断连,但可能反而使滑条的判定变好——等一下,现在pp好像只看acc来着?

如果在滑条之后的100判定区间结束后,滑条仍未结束可判定状态,且此时滑条没有处于正在按的状态,则与普通note一样,滑条也会离开可判定状态,以这个滑条最后一次被按的时间进行结算;但如果此时滑条仍处在按下状态,则会继续直到滑条尾之后的50判定区间结束后,可判定状态才会默认结束。

提示

由于只有最后一次按键的结束时间在滑条尾之前的50判定区间开始前,或者这个滑条至始至终都没有被按过时,才会出现滑条之后的100判定区间结束后滑条仍未结束可判定状态,而且此时滑条没有在按键状态的现象,因此在这种情况下最后判定结果会为miss(即滑条断尾或漏键);

但如果此时滑条处在被按状态,可判定区间会延长到50的判定区间结束时。下文我们会看到,这会让滑条按得太过时,最终得到的判定变差。有时候判定松好像也不是好事。

上文中的按键开始时间和结束时间一般情况下都等于该滑条最后一次按键的开始和结束时间,但以下情况除外:

若按键开始时间在滑条头之前的miss判定区间内,则将按键开始时间设置为(滑条结束时间1毫秒)\left (\text{滑条结束时间}-1\text{毫秒}\right )

提示

这一点相当神必——要注意出现的值是滑条结束时间,而不是按键结束时间。从这里可以推出的是,滑条不会因为过早按键而miss,如果滑条足够短,甚至可能在过早按键时拿到较好的判定。我不清楚这一点的目的是什么。

若滑条尾的50判定区间结束时,滑条仍处在按下状态,则该滑条的可判定状态仍会结束,以当前时间作为按键结束时间。所以只要滑条头的判定足够准,你甚至可以在滑条按得太过的情况下拿到200判定。

由以上内容可见,滑条头部可以认为有和普通note类似的正常判定区间(只是彩黄300的判定略有不同,以及不会发生过早按键而miss),而滑条尾的各级判定会随着滑条头的误差而发生很大的变化。


  1. 有大佬开发出了可以hack这个值的程序,只需要修改决定播放速度的值,之后再开DT或HT,就可以实现以任意速度玩一个谱面。然而问题是下落速度和判定区间会发生变化。这足以证明DT、HT的实现机制确实是改变播放速度。(不要指望拿它作弊,你个小机灵鬼。) ↩︎

  2. 如果你见过那个呲牙的mania皮肤,你一定能理解这是怎么样子。 ↩︎