台差と時間差
2019.04.13
さてわりといきなりガチなDIVA Arcadeのお話になりますが、

このゲーム、

「台差」 と 「時間差」 

と言われるものの存在が(ほぼ確定事項として)噂されています。

詳しくはこの辺の超プロい人の説明参照。
Project DIVA Arcadeの正しい遊び方と間違った遊び方 Part 2 - こすでぃ~さんと音の出るゲーム
http://cosdivalove.hatenablog.com/entry/2017/12/20/085017


まあつまりどういうことかというと、
・台差=筐体によって点数が変わる
・時間差=なんと、同じ筐体でもやるたびに点数が変わる
というような話です。
っていうか条件が同じだからってプレイするたびに同じ点数出る方が人としておかしいだろ!

これを突き詰めるためにDIVAのコードを見たかった・・・。

で、いきなりコードですが、
14012D7DB: movss    xmm8,dword ptr [rbx+012A6Ch]   ;[rbx+012A6Ch]=0.03
14012D7E4: comiss   xmm6,xmm8
14012D7E8: ja       014012DAAB                     ;xmm6が0.03より大きかったらjmp
14012D7EE: comiss   xmm6,dword ptr [rbx+012A70h]   ;[rbx+012A70h]=-0.03
14012D7F5: jb       014012DAAB                     ;xmm6が-0.03より小さかったらjmp
14012D7FB: mov      r14d,ecx                       ;COOL(r14d=ecx=0)
14012D7FE: jmp      014012DAF8                     ;判定確定
-----
14012DAAB: comiss   xmm6,dword ptr [rbx+012A74h]   ;[rbx+12a74]=0.07
14012DAB2: ja       014012DAC5                     ;xmm6が0.07より大きかったらjmp
14012DAB4: comiss   xmm6,dword ptr [rbx+012A78h]   ;[rbx+12a78]=-0.07
14012DABB: jb       014012DAC5                     ;xmm6が-0.07より小さかったらjmp
14012DABD: mov      r14d,1                         ;FINE(1)
14012DAC3: jmp      014012DAF8                     ;判定確定
-----
14012DAC5: comiss   xmm6,dword ptr [rbx+012A7Ch]   ;[rbx+012A7Ch]=0.1
14012DACC: ja       014012DADF                     ;xmm6が0.1より大きかったらjmp
14012DACE: comiss   xmm6,dword ptr [rbx+012A80h]   ;[rbx+012A80h]=-0.1
14012DAD5: jb       014012DADF                     ;xmm6が-0.1より小さかったらjmp
14012DAD7: mov      r14d,2                         ;SAFE(2)
14012DADD: jmp      014012DAF8                     ;判定確定
-----
14012DADF: comiss   xmm6,dword ptr [rbx+012A84h]   ;[rbx+012A84h]=0.13
14012DAE6: ja       014012DAF8                     ;xmm6が0.13より大きかったらjmp
14012DAE8: comiss   xmm6,dword ptr [rbx+012A88h]   ;[rbx+012A88h]=-0.13
14012DAEF: mov      eax,3                          ;SAD(3)
14012DAF4: cmovae   r14d,eax                       ;xmm6が-0.13以上なら代入
14012DAF8: 判定確定


と、なっています。
ここの処理に来る前段階として、xmm6にジャストタイミングとボタンを押したタイミングの差分が秒単位で入っているようです。
いや、単位が秒ってのを間違いなく確定できるほど解析してませんがまあおそらくあってるでしょう。


つまり、こう。
COOL:  -0.03≦xmm6≦0.03
FINE:  -0.07≦xmm6≦0.07
SAFE:  -0.1 ≦xmm6≦0.1
SAD:   -0.13≦xmm6≦0.13
※スライドは別判定


とりあえず重要なことは、VSYNCは判定には一切関係ないということ。
うむ、それは解った。ではなぜ台差とか時間差なんて物が発生するのか。


(1)ポーリングのタイミング
判定の基準クロックとポーリングの基準クロックが同じクロック源の場合に起こりえる。

どういうことかというと、ジャストタイミングに対して、いつポーリングするかにより、
筐体Aの場合、緑矢印で示された区間(1ポーリングタイム)にボタンを押した場合にしかCOOL判定にしかならない。
それに対し、筐体Bの場合、2ポーリングタイム分の間にボタンを押すと、COOLとなる。
この図であれば、COOL判定時間は2倍となる。実際にはポーリングはもっと細かいはず。
これはあくまでジャストタイミングに対してのポーリングタイミングのずれなので、曲の開始とポーリング開始が同期していれば、毎回同じ結果になる、
なので、「この曲のここは広い」というような現象が毎回確定で発生する可能性が高い。
※あくまで「曲の開始とポーリング開始が同期していれば」である。ここが同期しているかどうかは解析できていない。

(2)ポーリング周期
判定の基準クロックとポーリングの基準クロックが別クロック源の場合、そこには多少なりとも誤差が発生する。

これもどういう事かというと、筐体AではCOOL期間にどういうタイミングでもポーリングが3回行われないが、
筐体Bでは3回行われる場合がある。ということ。
なので、微妙な誤差でCOOL判定となる時間が1ポーリングタイム分変動する可能性がある。
この現象は(1)で説明した事象も考慮すると、必ず3回になるわけでもない。
つまり、「この曲のここは広い」というような現象が発生しうる、ということ。
どこが広いか、というのは、2つのクロックの誤差に依存する。
原発振クロックはだいたいマザーボードとかIOボードとかの水晶発振子なので、
こういう情報が参考になるかと。
[水晶振動子の基礎講座] 水晶振動子の電気的特性に関する用語説明
マクニカオンラインサービス
https://service.macnica.co.jp/library/127525

これもつまり何が言いたいかというと、
一般的な製造誤差は±30ppmとか。
それに対し、温度などでの特性変化は常温なら±3ppm。つまり、一桁違う。
なので、この誤差の挙動は、筐体(ボード)製造時に決定的に決まり、温特などでの変化は少ない。
この辺が筐体差の原因可能性が高そう。
温特での変化が時間差といわれる挙動になるんだろうか。

というわけで、ポーリング周期は誰が主導権を持っているのか。Nu側であればどのクロック基準なのか。
IOボード側に主導権がある可能性もある。
あと、プレイ開始とポーリングタイミングの開始は固定なのか。アドバタイズでもボタンの読み込みはしているが、プレイ開始時に一旦リセットされるのだろうか。
とか。
うん、その辺をもうちょっと詰めたい。

まあ正直言うと、ここを気にするほどのプレイヤースキルはありません。
ってか★10クリアできてない曲とかあるしね。
DIVAの1フレ以下の挙動を体感できて、ミドルとかファームレベルのソフトの心得があって、こういうローレベルな挙動とか理論的に考えらる人材とかどっかに居ませんかね・・・。(そんな奴イネーヨ



後日に続く
2019.04.13 00:46 | 固定リンク | 未分類 | コメント (0)

- CafeNote -