q--- created: 2025-07-15T17:31:29+09:00 publish: false title: beatmania IIDX INFINITAS on Linux

Windowsでは判定+0.20だったが、最適化したLinuxでは+0.00でWindowsと同等の判定感覚になった。つまり描画遅延が少ないということ。

Windowsで音声レイテンシを最小化するためにはWASAPI排他モードかASIOを使う必要があるが、物理デバイスの要求が厳しい。ソフトウェアミキサーを挟まないので、デバイスドライバレベルで44100Hzをサポートしていないといけない。自分の使っているデバイスが48000Hzしかサポートしていなくて使えなかった。あとOBSでキャプチャもできないので、共有モードにするかVoicemeeterなどの仮想デバイスを使って回避する必要があり、そうするとレイテンシが悪化する。Linuxではカーネルミキサーに相当するPipeWireにより互換性を保ちつつ、レイテンシはASIO並みに小さくできる。

あまり前例がないので、トラブルシューティングが難しい。細部まで手を入れらるので、問題を理解できればほぼ解決できるが、理解するためにOSの仕組みから調査する必要がある。学ぶ過程を楽しめない人にとっては手に負えないだろう。この文書が助けになれば幸いだ。

Bazzite Linux

ディストリビューションはゲーミングに最適化されたBazziteを使う。モダンなLinuxゲーミング環境がOut-of-the-boxで使えるので非常に楽だった。ほとんどのシステムの設定はKDEでGUIから設定できるところしか触っていない。他のディストリビューションでも同様の環境は作れるが、構築は大変だと思う。

システムが不変イメージになっていて、システム領域にソフトウェアを追加したりできない。必要なものは自分のホームディレクトリにインストールする。これはメリットで、システムを壊す心配がないし、アップデートで問題があれば簡単にロールバックできる。

PipeWire

デフォルトは安全に寄せた設定になっているので、より低レイテンシになるように設定する。

konaste infinitas exec umu-run reg add 'HKCU\SOFTWARE\Wine\MediaFoundation' /v 'DisableGstByteStreamHandler' /t 'REG_DWORD' /d 1 /f '/reg:64' Media FoundationのバックエンドをGStreamerではなくFFmpegにする。

gamescope

SteamDeckのために開発されたなんか凄いヤツ。不要な画面バッファのコピーを排除し、負荷とレイテンシが小さくなるように設計されている。クライアントからはX11サーバーとして機能するが、ウィンドウマネージャは最小限なので実質Steam BigPictureなどのランチャーとの併用が前提となっている。

最終的に以下の設定に落ち着いた。

  • -w 1920 -h 1080: Windowsアプリからはこの解像度のディスプレイが接続されているように見える。これを指定しないとINFINITASは720pで起動してしまうので注意。

  • -r 120: Windowsアプリを120fpsに強制する。物理ディスプレイが144HzだろうがWindowsアプリは120fpsで動く(はず)。INFINITASは固定60fps/120fpsにしか対応していないので指定したほうがいい。

  • --rt: リアルタイム優先度で動かして、カクつきを無くす。sudo setcap 'cap_sys_nice=eip' <application>で権限を許可しておかないと有効にできない。

  • -f: フルスクリーンで起動する。-bでボーダーレスにもできるが、Waylandのディスプレイ設定に「フルスクリーンでティアリングを許可」という項目があるので、フルスクリーンのほうがレイテンシを小さくできる可能性がある。

  • -F fsr --sharpness 10: AMD FSRによるアップスケールをする。未指定だと線形補完になるはずで、FSRより軽量なはずなのにカクつきが発生した。nearestだと近傍補完で見た目がFHDそのままのピクセル状になるがカクつきはなかった。FSRでシャープネスを下げたら違和感なかったのでよしとする。

  • --adaptive-sync: いわゆるG-SYNCやFreeSyncを有効にする。デスクトップ側で許可しておかないといけない。固定120Hzにするよりレイテンシが小さくなる可能性がある。

  • --mangoapp: パフォーマンスオーバーレイを表示する。オーバーレイの設定は ~/.config/MangoHud/MangoHud.confで行う。起動しておけばホットキーでトグルできるので、常に有効でよさそう。

  • nested mode: 普通にデスクトップ環境で起動するとこれになる。デスクトップがWaylandなら--backend waylandが使われ、X11なら--backend sdlが使われる。gamescopeの出力をさらにデスクトップのWaylandが他のウィンドウと合成するのでレイテンシは増加するが、使い勝手はいい。Windowsでもたぶんこれと同じ動き。

  • embedded mode: Steam Deckなどの専用機で使われることを想定したモードで、デスクトップと共存できない。試していないが--backend drmが使われるはず。gamescopeが直接GPUを制御するので、レイテンシは最小になる。デスクトップPCでもマルチモニタにして、メインをembedded modeに占有さえ、サブでデスクトップを起動するという使い方ができるかもしれない。(いったんnested modeで満足したので試していない)

OBS

Flatpakでインストールした。普通にWindowsのときの同じように使えるので割愛。

GStreamer sourceを追加し、パイプラインに pipewiresrc target-object=gamescope ! video. と設定するとgamescopeをキャプチャできる。sync videoのチェックを外さないとガクガクになるので注意。

打鍵カウンター

https://github.com/dj-kata/inf_daken_counter_obsw

umu-launcherでは動かなかったので https://github.com/mmtrt/WINE_AppImage のWineを使う。ダウンロードしてchmod +xするだけで実行できる。

OBS Websocketに接続してコントロールし、ゲーム画面のスクリーンショットを保存して画像認識している。このとき保存パスとしてWindowsのパスを送信するが、OBSはLinuxネイティブで動いているのでパスを認識できず保存に失敗する。よって、Websocketプロキシを経由し、リクエスト内のパスを書き換える。

ゲームが1920x1080で動いていて、その未加工サーフェスを取得していることが前提になっており(WindowsでOBSでキャプチャするとこの条件を満たす)、gamescopeで4KにアップスケールしたものをFHDにダウンスケールするパイプラインだと画像認識がほぼ機能しない。

4KディスプレイでLinuxデスクトップをFHDに設定するとソフトウェア的には問題なく動くが、4Kパネルへのアップスケールがディスプレイ側で行われ、このレイテンシが体感できるレベルで大きい。おそらくディスプレイへはパネルネイティブの4Kで出力しないと、低遅延モードが有効になっていない。

で、Linuxデスクトップを4Kに設定するわけだが、そうするとgamescopeの出力が4Kにしてアップスケールすることになる。これをOBSで普通にキャプチャするともちろん4Kだし、gamescope内蔵のpipewire出力も4Kになっていて、オリジナルのFHDをキャプチャする手段がない。

よって、gamescopeにパッチを当て、pipewire出力をスケーリング後の出力解像度ではなく内部アプリのネイティブ解像度に変更するようにした。そうすると、OBSからはFHDがキャプチャでき、物理表示はアップスケールされた4Kが実現できる。

なお、ソースがあるのでLinuxネイティブのPythonで動かそうとしたが、足りないファイル(楽曲データが置いてあるGoogle Cloud Storageの認証情報など)があったりして、作者の配布しているバイナリから取り出すしかなさそうだった。そのへんゴニョゴニョするくらいなら、キャプチャが4Kだろうが認識できるようにもしたいし、そのうち自前で同じようなものをクロスプラットフォームで作ろうと思った。

INFINITASのクセ

マスタークロックが画面描画と同期しているらしい? 描画設定がおかしいとBGMトラックとキー音が盛大にずれたりする。普通は音声かタイマーをマスタークロックにして画面は非同期で描画するだろうから、かなり作りが古いと思う。ボルテは音声マスタークロックだと思う。 画面描画ディレイを設定できない。 音声ディレイを設定できない。これはキー音があるから仕方ない。音声レイテンシを最小化しないと、キー音が遅れて違和感になる。 判定調整がなにを調整しているのかよくわからない。たぶんPGREATの判定オフセットだと思うが、描画と音を個別に調整できないので、どちらかに合わせると反対がずれることになると思う。 総じて、かなり動作環境がシビアで、描画レイテンシ、音声レイテンシを最小化しないと快適に遊べない。