Unity Pro Tips

DEVELOPER詳細

Profile Analyzer でゲームを最適化

<このページで学べる内容>

このページで学ぶ内容:Unity の Profile Analyzer を使用して、アセットやコードの変更、最適化のための作業、設定の変更、Unity のバージョンのアップグレードの影響を確認する方法について学びます。この記事は、Unite Copenhagen 2019 の Lyndon Homewood によるセッションをベースとしています。

Profile Analyzer の概要

パフォーマンスを改善するためには、どこに注力すればよいか知りたくないですか?変更前、変更後のパフォーマンス比較をしたくないですか?Unity のバージョンアップデートがゲームにもたらす影響を把握していますか?Performance Analyzer は、こういったことを俯瞰するのに手助けしてくれるものです。 

このツールを使用すれば、どこに力をそそげば良いのかを特定してくれるだけでなく、2 つの Unity パフォーマンスのキャプチャーを見比べることができるので、変更したことによる影響を比較できるようになります。ツールが視覚的に表してくれるので、行った変更がパフォーマンスに及ぼす影響を理解するのにも役立ちます。 

Profile Analyzer は、Unity プロファイラーの一連のフレームから、フレームやマーカーデータを集計して視覚化します。これは多数のフレーム中における動作の理由付けを探るのに役立つもので、Unity プロファイラーですでに利用可能な単一フレーム分析を補完するものです。

さらに Profile Analyzer は、複数のフレームに対して CPU パフォーマンスの分析も実行します。ツールには統計情報やビジュアライゼーションが備わっており、情報を一目で把握できるようになっています。また、包括的なフィルタリング機能もサポートしているため、気になったセクションを細かく掘り下げることができます。これを活用することで 2 つのデータセットを比較したり、データをエクスポートして他のツールで分析したりできます。 

Profile Analyzer は 2018.4 LTS 以降でパッケージとして使用できますが、ダウンロードしてプロジェクトにドロップすることもできます。これは Unity のバージョン 5.6 以降で機能します。起動するには、「Window」 > 「Analysis」 > 「Profile Analyzer」に移動します。古いバージョンの Unity では、「Window」メニューから直接起動できます。

プロファイリングのヒント

Profile Analyzer を使うプロファイリングを始めるのに役立つヒントをいくつか紹介します。 

  1. 注目しやすいものや繰り返しになっている部分のキャプチャーを取得する。
  2. 他のすべてのアプリケーションを閉じておく。C# スクリプトに Profile.logFile を使用すれば、実行中のゲームから プロフィールデータを直接書き出すことができるので、エディターを開いておく必要はありません。なんにせよ、書き出された .raw ファイルは、後で Unity プロファイラーにロードすることが可能です。 
  3. CPU パフォーマンススケーリングは無効にする。これで Intel SpeedStep や Turbo Boost の設定などのクロック周波数の変更は取得されなくなります。

特定の関数のパフォーマンスを確認する

呼び出す関数がパフォーマンスにどのような影響を及ぼすか見たい場合は、Unity プロファイラーを使ってデータをキャプチャーしましょう。キャプチャーした後、「Pull Data」ボタンを使用して Profile Analyzer にロードすることができます。または、以前に保存しておいたキャプチャーをロードすることもできます。 

これを行うとすぐに分析が始まり、フレーム時間グラフにデータが入力されます。グラフには白と水色のバーがあります。白のバーはフレームの継続時間を表し、水色のバーは現在選択されているマーカーを表します。これにより、マーカーがフレーム時間にどれほど貢献しているかを確認できます。 

マーカーは、フィルターを使用して検索できます。マーカーの詳細が選択したサブセットを反映するよう自動的に更新され、「Count」列には出現回数が表示されます。フレーム時間グラフではマーカーがハイライトされます。マーカーを選択すると、「Marker Summary」も更新されます。

代表的なフレームを見つける

パフォーマンスを分析するときは、見ているデータが代表的なデータであることを確認する必要があります。データのノイズが多い場合、右上にある「Frame Summary」を使用することで、平均的なフレームを選択していることを簡単に確認できます。「Median」として表示されている「Frame」をクリックすると、プロファイラーに関連する分析が表示されます。または、フレーム時間グラフを右クリックして、「Select Median Frame」を選択します。 

また、分析を選択した複数のフレームに限定することもできます。表示されるすべての統計は、その具体的に選択した内容を反映するように更新されます。 

単一のフレームの単一のデータポイントに依存するのではなく、代表的な一連のフレームを選択することで、複数のデータポイントを分析できます。フレームの継続時間のグラフを右クリックして「Order by Frame Duration」を選択し、代表的なサンプルとして中央値フレーム周辺の一連のフレームを選択することで、データのノイズに関わる問題を解消できます。

プロジェクト設定を変更することの効果

Profile Analyzer は、プロジェクト全体の設定を適用する(Graphics Jobs を有効にするなど)ときのパフォーマンスの差を確認するのに役立ちます。この機能を使用するには、ベースラインのキャプチャーを取り、変更を加えた後に別のキャプチャーを取ります。ゲームを実行して Unity プロファイラーでサンプリングし、そのキャプチャーを Profile Analyzer に取り込んで、さらに 2 つ目のキャプチャーを取り込みます。

2 つのキャプチャーの結果は、「Frame Summary」セクションで横並びで確認できます。

GPU バウンド適否

パフォーマンスにボトルネックがないことを確認するには、Gfx.WaitForPresent マーカーをチェックします。フィルター領域に「Gfx.WaitForPresent」と入力して検索します。そのマーカーの中央値がゼロ以外の数値の場合、CPU が処理を続行する前に GPU のアクティビティが終了するのを待機しています。 

フレーム時間グラフでそのマーカーを見ることで、それがフレーム時間にどれほど貢献しているかを確認できます。CPU が GPU を待機している場合は、おそらく GPU バウンドです。最適化を加える方法については、GPU プロファイリングツールを確認してください。

Profile Analyzer のインターフェースの基本

データセット管理

データは、「Profile Analyzer」ウィンドウのメイン上部のセクションで管理できます。ここから Unity プロファイラーを開いたり、Unity プロファイラーから「Pull Data」を実行したり、前に保存したファイル(すべてのバージョンの Unity に対応)をロードしたりできます。 

データがロードされれば、そのデータがフレーム時間グラフ内に表示されるようになります。この部分は対話式で、さまざまなサンプルから選択できます。これにより、マーカーテーブル内のすべてのサマリー情報が選択内容を反映するように自動的に更新されます。選択内容を右クリックすることで、より詳細なオプションにアクセスできます。 

「Save」ボタンをクリックして、分析データを .pdata ファイルとして保存できます。保存ファイルには、Profile Analyzer の保存ファイル(.pdata)とプロファイラーの保存ファイル(.data または .raw)の 2 種類があることに注意してください。両ファイルとも同じディレクトリに保存することをお勧めします。 

フレームのサマリー

「Frame Summary」には、最小値、最大値、中央値など、フレーム時間に関するハイライトが表示されるほか、Unity プロファイラーの特定のフレームにジャンプできるボタンがあります。また、この領域にはフレーム時間の分布ヒストグラムや箱ひげ図も表示されます。 

マーカーテーブル

マーカーの詳細

このセクションには、Unity プロファイラーからの全スタック深度のマーカーデータのマーカーテーブルがあります。すべてのマーカーの Unity プロファイラーのデータが集計され、そこから提供される中央値とその他のフレーム時間もこのテーブルに表示されます。 

マーカーのサマリー

右側の「Marker Summary」領域には、選択したマーカーに関する集計情報と、それらのフレーム時間に対する貢献が表示されます。また、この情報はヒストグラムや箱ひげ図として視覚的に表示されます。

サマリーの下部には、集計されたデータセット内の個々のマーカーインスタンスの最小時間と最大時間が表示されます。  

フィルター

1. 名前で

特定の名前のマーカーに絞って表示するには、1 つの部分文字列または部分文字列のコレクションを入力します。名前にスペースが入っている場合は、その部分文字列を引用符で囲んでください。 

関心のないマーカーを除外することもできます。たとえば、ジョブのアイドル時間に基づいてマーカーを除外したり、プロファイラー自体の一部であるマーカーを除外したりできます。 

フィルターは、テーブル内で関心のあるマーカーを右クリックすることで適用できます。

2. スレッド

特定のワーカースレッドのデータを表示するよう選択できます。すべて集計された状態で表示するには、スレッドを選択するポップアップウィンドウの上部にある「All」をオンにします。 

3. 深度

Unity のほとんどのサブシステムの概要マーカーは深度 3 であるため、そのレベルで見ることをお勧めしています。こうすることで、レンダリング、アニメーション、物理演算などの主なサブシステムの貢献度を確認できます(深度 3 は Unity の最新リリースに該当する深度です。古いリリースの場合は、別の深度に切り替えることをお勧めします)。

4. 親

親でフィルター処理するには、マーカーテーブル内のマーカーを右クリックし、「Set as Parent Marker Filter」を選択します。

5. 分析タイプ

デフォルトでは、Profile Analyzer にはマーカーの合計時間が表示されますが、セルフ時間に変更できます。セルフ時間は、時間が実際にどこに費やされているか詳細を確認する場合に便利です。 

6. 単位

デフォルトの単位はミリ秒ですが、より短くしたいのであればマイクロ秒に切り替えることができます。

トップ 10 のマーカー

トップ 10 のマーカーとは、今までにフィルターに設定した回数が多い上位 10 件のマーカーです。このツールを使用する最適な方法は、「Main Thread」を選択して合計時間に設定し、Unity のサブシステムが見られるように深度 3 の子を含めます。これにより、レンダリング、物理演算、アニメーション時間など、これらの主なシステムのそれぞれの貢献度の比率が表示されます。さらに詳細なレポートや分析については、データバーに上にカーソルを合わせると、正確なパーセンテージや指標を確認できます。 

データセットの比較

「Profile Analyzer」ウィンドウの上部で、「Compare」タブに切り替えて 2 つのデータセットを選択し、分析を実行できます。一方のデータセットは青で表示され、もう一方はオレンジで表示されます。また、単一のデータセットの 2 つのサブ領域を比較することもできます。たとえば、中央値のフレームを外れ値のフレームに対して比較できます。 

マーカーの比較テーブルではデータが青とオレンジで視覚的に表示されるため、2 つのデータセットのうち、特定の領域において実行速度が遅いのはどちらかを一目で確認できます。

いずれかのスキャンでマーカーがない場合、その列にはダッシュが表示されます。これは、たとえば使用している Unity のバージョンが異なるなど、マーカーの名前が変更されている場合に発生します。

データのエクスポート

Profile Analyzer からデータをエクスポートし、さらにカスタマイズして処理できます。マーカーテーブルのコンテンツ、フレーム時間グラフ、フレーム時間グラフの比較をエクスポートできます。

Profile Analyzer、プロファイラー、プロジェクトで具体的な機能の使用法に関してご質問がある方は、フォーラムのディスカッションにご参加ください。 


 

この記事はいかがでしたか?