Ryzen+RADEON環境でINFINITASの判定幅をガバガバのガバキックにする

初版:2022/08/07
更新:2022/11/20
文責:Stairwayの中のやつ

前説

「ACの自己ベが超えられない。」「ライバルのスコアACなら楽勝で超えられるのに…」
そんな傲慢な思いを抱きつつフラストレーションを溜めに溜めてついに爆発したので判定改善について試行錯誤してみた。

音について

遅延対策入門で調べた以上の情報は無さそうだったのでそのまま採用。

カスタム解像度で120.000Hzを作り出す

一番効果が高かった対策。
INFINITASの120Hz対応前によくあった59Hz病の120Hz版。
これはGeForce環境でも同じで設定手順は違えど同様の対処で効果が出るはず。
Intel GPUはカスタム解像度を作成できると聞いたことがないのでおそらく無理。(2022/08/07時点)

G.リフレッシュレート(Hz)が119.9xxHzでは絶対に駄目で120.000Hzを作る必要がある。


INFINITAS起動中にAlt+Rを押してディスプレイ設定を確認する。絶対にぴったり120にする。0.00(中略)01多くても少なくても判定は狭くなっていく。


伝送タイミングの詳細なんて知らないので計算してくれる便利なサイトを使った。
Video Timings Calculator

120Hz対応モニターを購入した場合に本当は120.000Hzなのか119.9xxHzなのかは数字は小さくても判定幅に対しては大きな問題なので、
それがわかっていない場合は144Hz以上対応しているFreeSyncやらG-Sync対応モニターを買ってカスタム解像度を作った方が安全なのではと思う。

HPETを有効にする(オカルトレベルの信頼性)

2023/01/09現在、HPETを有効にすると起動チェック画面から先に進まなくなる事象が確認されたので設定しないほうが良いかと思われます。
ゲーム本体、OS、ドライバ、またそれぞれのアップデート等、どこに原因があるか、はたまたそういう仕様にしたかは定かではありませんが、設定により問題を発生させる恐れがあります。
120.000Hz設定を行って判定はだいぶ改善したがそれでもまだ単発で判定に納得しきれない。
あと数点出るはずが出ないという思いに囚われはじめたので、内部判定処理を考察(妄想)しつつ結果としてHPETを有効化することにした。

そもそもHPETを使おうと思ったのが妄想から来るものなので、この対策の信頼性は高くないため注意すること。
またIntel環境ではこの設定を行うと逆に悪化させてしまう(はず)ので絶対に行わないこと。
Ryzen環境であってもゲームによってはプチフリ、フレームレートの大幅な低下などを引き起こす可能性がある設定のため、効果の割にリスクが非常に高いことは覚えておく必要がある。

デバイスマネージャー → システムデバイス → 高精度イベントタイマー が存在することを確認する。
存在しない場合はマザボのUEFI(or BIOS)から有効化する。


Windows ターミナル または コマンドプロンプトを管理者モードで実行。
bcdedit /enum
を実行して、useplatformclockの状態を確認する。
Noだったり項目が存在しない場合はHPETを使わない設定になっているので
bcdedit /set useplatformclock true
を実行して有効化する。


消す(デフォルトの設定に戻す)場合は bcdedit /deletevalue useplatformclock
HPETの副作用はググると山ほど出てくるので、自分がやるゲームや使うソフトと相談して慎重に検討した方が良い。

内部処理に対する考察(妄想)

判定改善は上記2項(音も入れると3項)で終りで以下は試行錯誤中に色々調べたメモ書き。

120FPS時代の59Hz病、119.9xxHz

まず事実として、INFINITASが120FPS対応前59Hzと60Hzで判定が違うとの意見がチラホラあった。
beatmaniaが内部的にフレーム判定を採用している前提で考えると納得できる話で、
59Hzなのに2Fの判定幅を確保してしまうと1000ms/59Hz=16.95ms、60Hzの時よりも1.7%ほど判定が広くなってしまう。
※実際は59.98Hzとかなはずなので差はもっと少ないと思われるが...

競技性を担保するためには判定幅が広がることは認められないだろうということが容易に想像(妄想)できる。
最悪1.7%広がる判定をどうにか対処する必要があるはずなので、
タイマーから得られる現在時間もあわせて参照するようなロジックになっているのではと考えられる。


この想像が正しい場合、60FPSモードの59Hzモニタでは1FほどPG判定が狭くなり、
120FPSモードの119.9xxHzモニタでは0.5Fほど判定が狭くなるケースが出てくる。

またこの判定を行っている場合は内部タイマーの精度が重要になってくる。
基準となる120FPSの判定フレームか否かを検証するのは内部タイマーのため。

Ryzenの内部タイマーはどこまで信頼できるのか

妄想が捗りすぎて内部タイマーをどうにかしたいという思いに囚われてしまい
じゃあHPET使ってみるかと安直に対応した結果、なんか判定改善した!…ような気がする。。。という微妙な結果になってしまった。
個人的な体感では単発で3~10点謎のGREATが発生していた部分が光るようになったと思う。
ただ判定に対する信頼感や降ってくる譜面、その時々の調子で簡単に変わる点差でもあるので本当に効果があるかは保証できない。

個人的には効果があったと思うリザルト
EMPかSIRIUSでめっちゃACやってた時に1108、119.9xxHzのHPET OFFで数回やって1101、120.000Hz HPET ONで1113


INFINITAS+HPET(高精度イベントタイマー)に関する情報はいくらググっても出てこず、
Ryzenのタイマー精度に対する詳しい内容などもかなり調べるのに苦戦したが、
Ryzen Intel Timer PrecisionとかiTSC HPET Precisionとか変なキーワードで検索しまくった結果いくつか怪しい情報を見つけた。

Ryzen ThreadRipper and timers
Intelはコア共通で1つのタイマーを使うが、AMDは伝統的にコアごとに異なるタイマーを持っているという話。
※Ryzenでもその作りになっているかは不明
最近のCPUは可変クロックでタイマーがずれてしまうことを防ぐためにInvariant TSCというクロックが可変しても進行速度が変わらないタイマーを持っているけれども、
それがコアごとに違ったら実行コアが変わると時間のズレが出てくるので前項で妄想した内部処理に悪影響が出てくるはず。

TSC marked unstable on AMD Ryzen 2000
RyzenのコアごとのTSCを取得して信頼できるかどうかを検証してるっぽい。
そんで時間がワープしただのなんだの、最新の(2022/08時点)Ryzen 5000シリーズでも同様の問題が発生するだの騒いでるっぽい。
CPU #0で500msのタイマーを設定したらHPETでは488ms、CPU #3では496msだったみたいな恐ろしい書き込みもあった。

HPETの取得コストはiTSCに対してバカ高くて50倍くらい遅いのだけれどそれでも1.2マイクロ秒程度で
それでコアによらない一貫して信頼性があるタイマー値を取得できるのならHPETの方がいいという結論になった。
※理屈的にはHPETを使わずとも実行コアを固定すればタイマー値は安定するはずだけれども、実行コア固定するよりもHPETのほうが手軽だった。

またRyzenはIntel CPUに比べてHPET有効化時のパフォーマンス影響がかなり少ないという点もHPETを使うことを後押しした。
※Intel環境でHPETを使うと逆に悪化させると書いたのはこの理由のため。Ryzenと違って使うメリットがないしパフォーマンスが酷い物だと数十%レベルで落ちる。


以上