フレームレート(fps)
ゲームが1秒間にどれぐらい処理しているかを表す数値。
ゲーム中、常に関わってくる問題になるので、私はロード時間と同じくらい気にするタイプです。
ずっと気にはなっていたのですが、手を出していなかった案件。
きっかけは「BORDER BREAK」のインタビューでしきりに「60fps」
実際遊んでみてもそんな感じがしたし、おそらくその通りなんでしょうが、
各ハードに直接アタッチするわけにはいかないのでキャプチャした
60fpsで考えるとして毎フレーム処理ができているのであれば
なら画面が更新されていない=
画面が更新されていない、
(描画と処理の更新頻度が異なるシステムもありそうだけど、一緒という前提で話を進めます)
まずはありもので
いきなりコード書くのはシンドいのでありもので考えます。
まず探したのは動画から1フレームずつBMP出力するソフトを用意。
「Super Bara-Baby X」
そして、その出力したBMPを比較するツールを用意。
「ImageMagick」
この組み合わせで一応グラフ化するところまでは完成。
でもこのやり方だと以下のような欠点が。
- 数千フレームをBMPにするので容量が爆裂
- 速度的にSSDで作業する必要がありますが、私のPCのSSD自体の容量が少ないので困りました
- どのフレームで落ちているのかわかりづらい
- グラフ化されてざっくりフレームレートがどんなものかわかるけど、具体的にどんな絵だったかはすぐに理解することが難しい
以上のことを踏まえてコードで書くことに。
いろいろ試す
動画を扱うのにまず試したのが「WindowsForm + axWindowsMediaPlayer」。
コントロール足してちょっとコード書くだけで動画を再生できる。
しかし、フレーム送りが出来ない。
currentPosition に 16ms 足せば一応それっぽいことは出来るけど、1/
次に試したのが、「WindowsForm + DirectShow.NET」。
しかし、mp4再生時にクラッシュ。フレーム単位での指定も不可。
そもそもDirectShow自体、現在はあまり推奨されていないみたい
次は「WPF + MediaElement」。
こちらもフレーム単位での指定不可。
最後に「WindowsForm + OpenCV」。
OpenCVを使えばフレーム送りが出来る。
ざっと試していけそうだったのでコチラを採用。
スペックが足りない
試しに昔キャプチャしたMP4データで試します。
それっぽくフレームレートが取得できるものの、
(ある程度の差分は無視する、みたいなことすれば一応判定は出来るけど、それだとフェアじゃないよなあ)
これは無圧縮でキャプチャできる環境が必要そう・・・ということで「MonsterX u3.0r」を購入。
PS4の「モンスターハンター:ワールド」で試してみるもののちゃんと録画が出来ない。(途中で大幅にフレーム落ち、そして録画が止まる)
調べてみると常に500MByte/s出る必要があるらしく、
ということでSSDを追加で購入。
「SDSSDH3-500G-J25」
容量的には1TBがいいなと思いましたが、
でもSSDを替えても結局キャプチャ時にフレーム落ちする。(アプリの作りが悪い?)
しょうがないので無圧縮は諦めて【可逆圧縮】を試みる。
「アマレコ+Ut Video Codec Suite」で比較的簡単に構築完了。
しかも、負荷が全然軽く素敵。(使用コーデックはULY2)
負荷が高くて困っていたボーダーブレイク専用録画PCでも全然余裕でした。
「GC550」や「C988」でも実現可能になったのでせっかく「MonsterX u3.0r」買いましたが、はやくもお役御免に・・
ようやく検証開始
まずはPS4の「モンスターハンター:ワールド」。
これはノイズが入ってしっかり取得できませんでした。
HDCPが有効になっていたのでそれが原因?
一方、「splatoon2」や「モンスターハンターダブルクロス」などのSwitchのゲームは問題なく取得できてる。
となると原因はPS4側・・
いろいろ調べた結果、RGBレンジが「フル」になっていなかったのが原因でした。
「自動(推奨)」が選択されていて内部的には「リミテッド」になっていました。
お試しでいくつか検証してみました。
PS4Proは持ってないのでノーマルPS4でキャプチャしてます。
(Steam版もリリースされたあとなのでほんと今更感が凄いですが・・)
だいたい30fps前後なんですね。
海外のゲームはよくフレームレート検証されてましたが、日本製のゲームはあまりやられてないなあと思ったので気が向いたらいろいろ調べたいと思います。
にしても1分30秒程度の動画を検証するには30分もかかる・・・処理上げが必要ですね。
とりあえず、まずは当初の予定通り「BORDER BREAK」調べます。