テストレポート
DX12,Vulkan&UWP対応のフレームレート計測ツール「PresentMonLauncher」が登場。さっそく使ってみた
いずれも,発表当初は対応タイトルが皆無だったが,DirectX 12対応のPCゲームは,AMDの熱いプッシュを受けたタイトルとして知られる「Ashes of the Singularity」を皮切りに,少しずつ増えてきた。また,Vulkanのほうも,リブート版の「DOOM」がいち早く対応したほか(関連記事),「Dota 2」がβサポートを開始していたりと,状況は変わりつつある。
ただ,それらPCゲームを使ってベンチマークテストを行いたいという一部の人々――もちろん4Gamerも含む――にとっては,悩ましい面もある。なぜかというと,これまでPCゲームのフレームレート計測ツールとして標準的に使われていた「Fraps」では,DirectX 12やVulkan対応ゲームのフレームレートを計測できないからだ。
Frapsを初めとする従来のフレームレート計測ツールは,Direct 3DのDrawCall(ドローコール)をフック(≒横取り)して,描画タイミングを調べることでフレームレートを計測している。その仕組みについては,NVIDIAが開発したフレームレート計測ツール「Frame Capture Analysis Tool」(略称:FCAT)の解説記事が詳しいので,興味のある人は参照してほしい。
しかしDirectX 12では,DrawCallを含めた3Dグラフィックスの描画APIが一新となったため,従来型のDirect3Dに依存したFrapsのようなツールでは,フレームレートを計測できない。Vulkan対応アプリケーションで計測が行えないのも,同じ理由である。
また,「Frapsなどからフレームレート計測を行えない」アプリケーションとしては,もう1つ,Universal Windows Platform準拠のもの(以下,UWPアプリ)もある。UWPアプリの場合は,セキュリティ上の理由からAPIのフックが許されていない。つまり,DrawCallのフック自体が不可能なので,フレームレートを計測できないのだ。
この「DirectX 12&Vulkan対応アプリケーションとUWPアプリでフレームレートを計測できない問題」は,ベンチマーカーを悩ませてきた。
たとえばNVIDIAは,前述の(導入に多額のコストがかかる)FCATを使うよう,テスターに推奨していたりするくらいなのだが,今回,この問題を抜本的に解決するかもしれないツールが出てきた。なので紹介してみようというのが,本稿の主旨である。
Intelが開発したフレームレート計測ツール「PresentMon」と,それを使いやすくした「PresentMonLauncher」
そもそもの話をしておくと,「DirectX 12&Vulkan対応アプリケーションとUWPアプリでフレームレートを計測できない問題」へ対策できるツールがなかったわけではない。具体例の1つはIntelのゲーム開発者支援サービス「GameTechDev」から登場したオープンソースソフトウェア「PresentMon」で,ソースコードは,プロジェクト共有サービス「GitHub」上で公開中だ。
GitHubのPresentMon公開ページ(英語)
PresentMonは,Windows 10に組み込まれているイベントトレース(Event Tracing for Windows,以下 ETW)機能を使って,3Dグラフィックスの描画タイミングをトレースする。APIのフックといった,乱暴なやり方ではなく,Windows 10における正規の方法で描画タイミングをトレースするため,DirectX 12やVulkan,
ただし,DirectX 9.0c以前の3Dグラフィックス描画はETWからトレースできないという制限もあったりはする。
ちなみにPresentMonは本来,ゲームのフレームレートを計測するためのソフトウェアではない。DirectX 12 APIを用いてレンダリングされた画像を表示する「Present」メソッドの呼び出し間隔や,Presentメソッドの処理時間といった細かなデータを,CSV形式のテキストファイルに出力してくれるという,開発者向けツールである。
そのCSVファイルを集計して,必要なデータだけを抜き出せば,ドロップしたフレーム数や各フレームの表示時間(フレームタイム)といったデータを得られるので,フレームレート計測ツール的にも使えるというわけだ。
しかし,PresentMonはコマンドラインプログラムなので,開発者でもない,単なるゲーマーには使いにくい。とくに,計測を行う対象となるプログラムのプロセスID,つまりゲームのプロセスIDをコマンド引数で指定する必要があるのは,端的に述べて面倒だ。開発者向けという仕様上,それはそれで悪くないのだが,「ちょっとフレームレートを計測してみたい」という用途だとなかなか難儀する。
名称から想像できる人もいると思うが,これは必要なパラメータをPresentMonに渡して起動するためのランチャーで,これまたGitHub上で公開中だ。
GitHubのPresentMonLauncher配布ページ(英語)
一般ユーザーが使えるレベルにまで操作を簡単にしたといっても,もともとがゲーマー向けベンチマークツールではないため,使い方は面倒な点もある。なので今回はまず,インストールの流れを,以下のとおり,簡単に紹介しておこう。
1.Githubから「PresentMonLauncher.exe」をダウンロード
上で示したリンクからGitHubへ行き,「Present
ちなみにこの実行ファイルはインストーラで,PresentMon本体も含んでいる。
2.PresentMonLauncher.exeを実行
PresentMonLauncher.exeを実行する。通常ならWindowsのセキュリティ警告を経て,インストーラが起動するはずだ。
あとは画面の指示に従って,[Next]ボタンをクリックしていけばいい。
なお,デフォルトのインストール先は「C:¥Present
PresentMonLauncherを実行してみる
インストールが完了すると,デスクトップにPresentMonLauncherのショートカットが作成されるはずだ。それをダブルクリックすると,ランチャーのメインウインドウが開く。
はっきり言って非常に分かりにくいUIなのだが,ざっくり言えば,左上にある「Select the process you want to capture:」という一覧欄から,テスト対象となるゲームのプロセスを選択して,[Run PresentMon]ボタンをクリックすれば計測を行える。
プロセス一覧の下には,「Simple」「No CSV Output」「Scroll Toggle」というチェックボックスがあるが,これらはいずれも,ベンチマーク用途で使うことはない。
PresentMonLauncherは,テスト後に自動で平均フレームレートを算出してくれる機能を持っているのだが,Simpleにチェックを入れると,一部のカラムを省略したシンプルなCSVファイルを出力することになり,結果,平均フレームレートを算出してくれなくなる。
No CSV OutputはCSVファイルが出力されないので論外。また,Scroll Toggleは,キーボードの[Scroll Lock]キーが押されている間だけ計測を行う機能を有効化するものだが,「[Scroll Lock]キーを計測スタートのトグルにする」といったことはできないので,やはりこれもチェックしないほうがいいだろう。
では,ベンチマークを計測するときにはどうしたらいいか。
PresentMonLauncherでは,計測時間を秒数で指定することになり,そのとき使うのが,3連チェックボックスの右隣にある,「Delay(s)」「Time(s)」の入力ボックスだ。
以上の設定を行ったら,DirectX 12もしくはVulkanに対応したゲーム,あるいはUWPアプリ版ゲームを起動する。ゲームの起動後,フレームレートを計測したいシーンまで進め,その時点で[Alt]+[Tab]キーを押すか,タスクバーからアイコンをクリックするかしてタスク切り替えを行い,PresentMonLauncherをアクティブにしよう。
PresentMonLauncherで「Select the process you wan to capture:」の右隣にある[Refresh List]ボタンを押すと,プロセスリストが最新の状態に更新されるので,一覧からゲームのプロセスを見つけ出し,それにチェックを入れる。
下に示したのは,今回のテストに用いたVulkan版DOOMのプロセスを探して,実際にチェックを入れたところだ。
これでテスト準備は完了だ。前述のとおり,[Run PresentMon]ボタンを押す。この時点でセキュリティ警告が出ると思うが,実行を許可しよう。
すると,PresentMonのコマンドウインドウが開くので,それを確認したらゲームに戻ろう。Delay(s)に設定した時間が経過したあたりで,フレームレートを計測したいゲームのプレイを始め,Time(s)で指定した時間だけプレイし続ければいい。
ちなみに計測中,Frapsのような「計測中であることを示すオーバーレイ表示」は一切出てこない。なので,本当に計測が進んでいるか不安になることもあるだろうが,これはもう信じて進むしかないだろう。
上の画像キャプションでも触れたが,計測中にタスク切り替えを行ってコマンドウインドウをアクティブにすると計測が止まってしまうので,そういうことはしないようにしてほしい。ちなみに上のスクリーンショットだと,スクリーンショットを撮るために[Alt]+[Tab]キーを押したため,「STALE」という表示が出て,計測が止まっている。
計測が終わったら,タスク切り替えを行うか,ゲームを終了するかしてPresentMonLauncherに戻り,[View Min/Max/AVG FPS]ボタンを押す。すると,PresentMonが保存したCSVファイルの一覧が表示される。
そこで結果を知りたいCSVファイルを選ぶと,ダイアログ右側に「Min FPS」(最小フレームレート),「Max FPS」(最大フレームレート),「Av.FPS」(平均フレームレート)という3つの数値が表示されるはずだ。
以上,PresentMonLauncherを使えば,DirectX 12やVulkanベースのゲームや,UWPアプリとして提供されているゲームであっても,フレームレートを計測できるようになる。
計測の開始&終了タイミングを時間でしか指定できず,トグルスイッチを利用できないとか,本当に計測されているかどうか,計測中に確認する術(すべ)がないとか,Frapsと比べると使い勝手はよろしくないのだが,これはもともとが開発者向けツールなので,やむを得ないところだろう。
4Gamerで今後,PresentMonLauncherを恒常的に利用するかどうかは,これからの検証次第だが,すでに述べたとおり,CSVファイルには,フレームレート以外にもかなりのデータが記録されているので,これらを活用できれば便利ではないかという予感はある。いずれ正式採用となれば,CSVファイルの中身についてはあらためて紹介したい。
ともあれ,DirectX12やVulkan対応タイトル,あるいはUWPアプリのフレームレートをさくっと知りたいときにPresentMonLancherは有用なので,興味のある人はぜひ試してほしいと思う。
GitHubのPresentMonLauncher配布ページ(英語)
- 関連タイトル:
ベンチマーク
- この記事のURL: