kimagre inrash

感想を書きます

ゲームのフレームレートを検証しよう

time 2018/08/14

フレームレート(fps)

ゲームが1秒間にどれぐらい処理しているかを表す数値。
ゲーム中、常に関わってくる問題になるので、私はロード時間と同じくらい気にするタイプです。

ずっと気にはなっていたのですが、手を出していなかった案件。

きっかけは「BORDER BREAK」のインタビューでしきりに「60fps」という発言をしていたことから。
実際遊んでみてもそんな感じがしたし、おそらくその通りなんでしょうが、せっかく材料だしてもらえたので検証してみることに。

各ハードに直接アタッチするわけにはいかないのでキャプチャした動画からフレームレートを検出できないかを考えます。

60fpsで考えるとして毎フレーム処理ができているのであれば、1秒間に60回画面が更新されるハズ。
なら画面が更新されていない=フレームが落ちていると判断しても問題なさそう?
画面が更新されていない、というのは1フレーム前の絵との差分をチェックすればわかりそうです。
(描画と処理の更新頻度が異なるシステムもありそうだけど、一緒という前提で話を進めます)

まずはありもので

いきなりコード書くのはシンドいのでありもので考えます。
まず探したのは動画から1フレームずつBMP出力するソフトを用意。
「Super Bara-Baby X」

そして、その出力したBMPを比較するツールを用意。
「ImageMagick」

この組み合わせで一応グラフ化するところまでは完成。
でもこのやり方だと以下のような欠点が。

  • 数千フレームをBMPにするので容量が爆裂
    • 速度的にSSDで作業する必要がありますが、私のPCのSSD自体の容量が少ないので困りました
  • どのフレームで落ちているのかわかりづらい
    • グラフ化されてざっくりフレームレートがどんなものかわかるけど、具体的にどんな絵だったかはすぐに理解することが難しい

以上のことを踏まえてコードで書くことに。

いろいろ試す

動画を扱うのにまず試したのが「WindowsForm + axWindowsMediaPlayer」。
コントロール足してちょっとコード書くだけで動画を再生できる。
しかし、フレーム送りが出来ない。
currentPosition に 16ms 足せば一応それっぽいことは出来るけど、1/60は正確には16msじゃないし計算誤差も気になるので一旦却下。

次に試したのが、「WindowsForm + DirectShow.NET」。
しかし、mp4再生時にクラッシュ。フレーム単位での指定も不可。
そもそもDirectShow自体、現在はあまり推奨されていないみたいなのでこれも却下。

次は「WPF + MediaElement」。
こちらもフレーム単位での指定不可。

最後に「WindowsForm + OpenCV」。
OpenCVを使えばフレーム送りが出来る。
ざっと試していけそうだったのでコチラを採用。

ついでに動画出力機能もつけてみました。
capture3784.jpg

スペックが足りない

試しに昔キャプチャしたMP4データで試します。
それっぽくフレームレートが取得できるものの、圧縮ノイズで誤判定することが判明。
(ある程度の差分は無視する、みたいなことすれば一応判定は出来るけど、それだとフェアじゃないよなあ)

これは無圧縮でキャプチャできる環境が必要そう・・・ということで「MonsterX u3.0r」を購入。
IMG_8736.JPG

PS4の「モンスターハンター:ワールド」で試してみるもののちゃんと録画が出来ない。(途中で大幅にフレーム落ち、そして録画が止まる)
調べてみると常に500MByte/s出る必要があるらしく、ウチのSSDではギリギリスペックが足りないのでした。

crystaldiskmark20180811.jpg

ということでSSDを追加で購入。
「SDSSDH3-500G-J25」
容量的には1TBがいいなと思いましたが、予算オーバーのため500GBで我慢することに。

でもSSDを替えても結局キャプチャ時にフレーム落ちする。(アプリの作りが悪い?)

しょうがないので無圧縮は諦めて【可逆圧縮】を試みる。
「アマレコ+Ut Video Codec Suite」で比較的簡単に構築完了。

しかも、負荷が全然軽く素敵。(使用コーデックはULY2)
負荷が高くて困っていたボーダーブレイク専用録画PCでも全然余裕でした。

「GC550」や「C988」でも実現可能になったのでせっかく「MonsterX u3.0r」買いましたが、はやくもお役御免に・・

ようやく検証開始

4f.jpg

まずはPS4の「モンスターハンター:ワールド」。

これはノイズが入ってしっかり取得できませんでした。
HDCPが有効になっていたのでそれが原因?
それとも書き込み間に合ってなくてAVIファイルが壊れているのが原因・・?

一方、「splatoon2」や「モンスターハンターダブルクロス」などのSwitchのゲームは問題なく取得できてる。

となると原因はPS4側・・

IMG_8767.JPG

いろいろ調べた結果、RGBレンジが「フル」になっていなかったのが原因でした。
「自動(推奨)」が選択されていて内部的には「リミテッド」になっていました。

お試しでいくつか検証してみました。

PS4Proは持ってないのでノーマルPS4でキャプチャしてます。
(Steam版もリリースされたあとなのでほんと今更感が凄いですが・・)
だいたい30fps前後なんですね。

海外のゲームはよくフレームレート検証されてましたが、日本製のゲームはあまりやられてないなあと思ったので気が向いたらいろいろ調べたいと思います。
にしても1分30秒程度の動画を検証するには30分もかかる・・・処理上げが必要ですね。

とりあえず、まずは当初の予定通り「BORDER BREAK」調べます。

前後記事

ゲームのフレームレート検証いろいろ