Skip to content

ui #6

Description

@torabit

Why

プレイ中にサブモニタで横目に見て 1F ずれを読み取れることが、このツールの成否そのものである。

What

src/ui.rs を作る。eframe と egui を使う。History::recent_trials を読んで描く。hidapi と report_decode に依存させない。

入力履歴のリストを 1 つだけ置く。ピアノロールは作らない。Street Fighter の入力表示と同じ形にする。

  • 直近 trials_shown 件 (既定 5) を History::recent_trials で取り、各試行の Trial::rows を古い順に縦に並べる
  • 新しい行を下に足す。リストは上に流れる
  • 試行の境目には区切り線を引く
  • 1 行の中身は、その区間で押されている入力の名前、押下 F、持続 F の 3 つ
  • 名前は held の全部を横に並べる。L1 と ↑ を同時に押していれば 1 行に 2 つ出る
  • 十字キーの ↑ と左スティックの ↑ は別の名前にする。D↑ と L↑ のように区別する
  • held が空の行も出す。名前の欄を空にして持続 F だけを出す。入力と入力の間合いは、この行の数字で読む
  • 押下 F は (at_us - origin_us) / (1_000_000.0 / fps)。fps の既定は 60
  • 持続 F は end_us - at_us を同じ式で F に直した値。押しっぱなしの間は増え続ける
  • どちらも小数第 1 位まで出す。整数に丸めない。12.7ms と 20.7ms がどちらも 1F になり、境界付近で判断を誤る
  • 持続 F が 99.0 を超えたら 99+ と出す。桁を 3 文字に収めるため。60fps の 99F は 1.65 秒で、1F のずれを読む用途でそれより長い持続を区別する意味が無い
  • 上限で 99 と出さないのは、120F を 99 と書くと数字が嘘になるため
  • gap_before が立った行は背景をグレーにする。欠落を隠さない

長押しで行が増えることは無い。Timeline がレポートごとではなく変化ごとにイベントを出し、Trial::rows がそれを区間に畳むので、前方向を 2 秒押しても行は 1 本になる。その 1 本の長さを表すのが持続 F になる。

常時表示する情報は以下。

  • 接続中のデバイス名、または未接続の表示
  • Timeline::scale_us_per_tick の推定値
  • Timeline::scale_warning が Some ならその文言
  • 量子化誤差の目安。USB のレポート間隔 4ms が ±0.24F に当たること
  • F 数が自前の 60fps グリッド上の値であること。ゲームがパッドを読む瞬間の位相は外から観測できないので、ゲームの中の数え方とは最大 1F ずれる

ゴール

  • Windows で起動し、DualSense を繋いでボタンを押すと、入力履歴のリストに行が増えて F 数が出る
  • L1 と ↑ を同時に押したとき、2 つの名前が 1 行に並ぶ
  • 意図的に間を空けて R1 を押したとき、間の空の行の持続 F が体感と合う
  • 前方向を押しっぱなしにしたとき、行が増えずに持続 F だけが増える。2 秒を超えると 99+ になる
  • 左スティックを 8 方向の境界の上で微動させたとき、行が増えない
  • ウィンドウを別のウィンドウで完全に覆った状態でも記録が続く。覆う前と後で受信間隔の median が変わらない。これは仕様の未検証の前提にあたるので、結果を issue にコメントする
  • ui.rs が hidapi と report_decode に依存していない
  • cargo coupling --check --min-grade=B --max-circular=0 ./src が通る

分解: #1 (comment) / Task 5 / e82b5387df06

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions