アプリケーションを最適化するには、プロジェクトがハードウェアリソースをどのように消費しているかを正確に測定することが必要です。Unity プロファイラーを拡張し、独自のパフォーマンス指標を使用することで、アプリケーションがなぜそのパフォーマンスを出しているかの背景をより深く理解することができます。この記事では、Unity 2021 LTS の新しいプロファイラー拡張機能を取り上げます。
新しいプロファイラーカウンターは、Unity アプリケーションやパッケージに独自のパフォーマンス指標を追加するための軽量なメカニズムを提供します。また、独自のプロファイラーモジュールを追加することで、プロファイラーウィンドウで指標を直接視覚化できるようになりました。これらの機能を利用して、Unity プロジェクトのパフォーマンスを向上させる方法について、詳しくはこちらをご覧ください。
Unity プロファイラーは、アプリケーションの詳細なパフォーマンス情報を取得するために使えるツールです。メモリ、オーディオ、レンダリングなど、さまざまなカテゴリの多数のパフォーマンス指標を追跡します。これらの指標はプロファイラーウィンドウで可視化され、いくつかのケースではスクリプトからクエリを出すこともできます。この情報を使って、Unity アプリケーションがターゲットプラットフォームに用意されたハードウェアリソースをどのように使用しているかを見通し、最適化を行うべき箇所をピンポイントで特定することができます。
プロファイラカウンターは、パフォーマンス分析に有用な Unity アプリケーションの指標を追跡、測定、または数え上げるものです。たとえば Unity では、「Total Used Memory」という、アプリケーションが使用するメモリの総バイト数を追跡するためのカウンターがプロファイラーに内蔵されています。これは、ターゲットデバイスにおけるアプリケーションのメモリフットプリントを測定するのに有効な統計値です。この値は、プロファイラーウィンドウの Memory モジュールで、他のメモリ関連の指標と一緒に経時的に表示されます(下の画像を参照)。
独自のプロファイラーカウンターを追加することで、独自のシステムやアプリケーションに固有のパフォーマンス指標を公開することができます。これらの指標は、プロファイラーウィンドウに、内蔵のカウンターを含む他のパフォーマンスデータと一緒に表示することができます。これにより、アプリケーションに固有のパフォーマンス特性を、プロファイラーウィンドウで直接、コンテクストに沿った形で表示することができます。
以下の例では、シーン内のアクティブなクリーチャーの数を追跡するために、カスタムのプロファイラーカウンターが追加されています。これは、各フレームで処理されたレンダリングバッチの数を追跡するプロファイラー内蔵のカウンターである Batches Count と一緒に表示されます。これにより、2 つの指標を相関させ、レンダラーが処理しなければならないバッチ数に対するクリーチャー数の影響を確認することが容易にできます。
さらに、プロファイラーのすべてのカウンターがリリースビルドで利用可能で、指定した部分については組み込みのカウンターの一部も利用できます。リリースビルドは、開発用ビルドに比べると、皆さんのアプリケーションの実際のパフォーマンスをより反映したものになっています。
ただし、Unity プロファイラーは、最適化に関する理由によって、リリースビルドにアタッチすることができません。そのため、プロファイラーカウンターを使用し、スクリプトからクエリを実行することで、リリースビルドにおいて重要な指標を選択して監視することができます。たとえば、継続的インテグレーションのテストにおいてパフォーマンスの低下を検出するためにこれを行うこともあるかもしれません。あるいは、Unity の UI システムのいずれかを使い、デバッグ用のゲーム内ユーザーインターフェースを介して、下に例として示した画像の左下隅に見えるように、いくつかの主要なパフォーマンス指標を表示することも可能です。詳しくは、Profiler Recorder のドキュメンテーションをご覧ください。
プロファイラーカウンターを開発用ビルドにのみ表示させたい場合は、条件付きコンパイルのドキュメンテーションで説明されているように、DEVELOPMENT_BUILD スクリプトシンボルでラップして、リリースビルドから除外することが可能です。
Unity のプロファイラーカウンターは、Unity 2021 LTS でリリースされた Profiling.Core パッケージで利用可能です。このパッケージは Unity 2021 LTS にバンドルされていますが、デフォルトではインストールされていませんので、パッケージドキュメンテーションのインストール方法に従って、パッケージマネージャーからこのパッケージを名前で指定して追加してください。
パッケージを入手したら、API で ProfilerCounter または ProfilerCounterValue と呼ばれるプロファイラーカウンターを作成し、次のように更新します。
using UnityEngine;
using Unity.Profiling;
public class CreatureCounter : MonoBehaviour
{
static readonly ProfilerCounterValue<int> k_CreatureCounter = new(ProfilerCategory.Scripts, "Creature Count",
ProfilerMarkerDataUnit.Count, ProfilerCounterOptions.FlushOnEndOfFrame);
void OnEnable()
{
k_CreatureCounter.Value += 1;
}
void OnDisable()
{
k_CreatureCounter.Value -= 1;
}
}
詳しくは、Profiling.Core のドキュメンテーションをご覧ください。
プロファイラーモジュールは、プロファイラーウィンドウのメモリ、オーディオ、レンダリングなど、特定の領域やワークフローのパフォーマンス情報を表示します。各プロファイラーモジュールは、モジュールごとのドメインのパフォーマンスプロファイルを把握することを目的としています。たとえば、下の画像の「Memory Profiler」モジュールは、メモリ使用量に関する 7 つの主要な指標を時系列で表示します。その下に、モジュールの詳細情報を表示する部分があります。ここでは選択したフレーム内のメモリ配分が示されています。
Unity 2021 LTS では、プロファイラーウィンドウを独自のプロファイラーモジュールでカスタマイズすることができます。これにより、自作システムのパフォーマンス指標をプロファイラーウィンドウに直接表示することができます。また、モジュールの詳細情報を表示する部分でカスタムされたビジュアライゼーションの機会を提供し、システムのパフォーマンスデータを自在に表示することができます。
プロファイラーモジュールエディターは、自分の手元で使うための一時的なプロファイラーモジュールを素早く作成するときに使うと役立つ機能です。たとえば、新しいプロファイラーカウンターを検証するためのプロファイラーモジュールを素早く作成するのに使うことができます。プロファイラーモジュールエディターで作成されたプロファイラーモジュールは、今使っているエディターだけで使えるもので、他のプロジェクトのユーザーは利用することができません。
詳しくは、モジュールエディターのドキュメンテーションをご覧ください。
プロファイラーモジュール API を使用すると、プロジェクトやパッケージの全ユーザーのプロファイラーウィンドウに独自のプロファイラーモジュールを追加することができます。この API を使ってプロジェクトやパッケージでプロファイラーモジュールを定義すると、そのプロジェクトやパッケージのすべてのユーザーがそのモジュールをプロファイラーウィンドウで自動的に利用できるようになります。
アセットストアのパブリッシャーまたはパッケージ開発者の方は、カスタムのプロファイラーモジュールをパッケージと一緒に配布できるようになりました。ユーザーが皆さんの作ったパッケージをインストールすると、同じく皆さんの作ったプロファイラーモジュールが自動的にユーザーのプロファイラーウィンドウで利用できるようになります。これにより、自分で作ったパッケージのパフォーマンス指標をプロファイラーウィンドウで直接公開することができます。
Unity 社内のいくつかのチームはすでにこの API を使用して、カスタムのプロファイラーモジュールをパッケージとともに配布しています。これには Netcode for GameObjects、Adaptive Performance、および Mali System Metrics パッケージが含まれています。
プロファイラーモジュール API を使ってプロファイラーモジュールを追加するには、以下のように、プロジェクトまたはパッケージ内に ProfilerModule スクリプトを作成します。
using Unity.Profiling;
using Unity.Profiling.Editor;
[System.Serializable]
[ProfilerModuleMetadata("Creature Batches")]
public class CreatureBatchesProfilerModule : ProfilerModule
{
static readonly ProfilerCounterDescriptor[]
k_Counters = {
new("Creature Count", ProfilerCategory.Scripts),
new("Batches Count", ProfilerCategory.Render), };
public CreatureBatchesProfilerModule() : base(k_Counters) { }
}
このモジュールは、プロジェクトまたはパッケージのすべてのユーザーに対して、プロファイラーウィンドウに自動的に表示されます。
プロファイラーモジュール API の使用方法については、マニュアルおよび API のドキュメンテーションを参照してください。
プロファイラーモジュール API には、UI Toolkit などの Unity のエディター UI システムのいずれかを使用して、選択したフレームのパフォーマンスデータについて、カスタムされたビジュアライゼーションを描画する機能が含まれています。
たとえば、Adaptive Performance パッケージのプロファイラーモジュールは、この API を使用して、選択したフレームにおける詳細なパフォーマンス情報、およびボトルネックや過熱時の警告インジケーターなどのコンテキスト情報を表示します。これらのインジケーターは、たとえば Adaptive Performance パッケージのユーザーが、サーマルスロットリングに遭遇する可能性がある場合に、そのことを明確に認識するのに役立ちます。この API を使って、プロファイラーモジュールのパフォーマンスデータについて、オーダーメイドのビジュアライゼーションを作ることができます。
プロファイラーカウンターと合わせて、さらに複雑なデータのビジュアライゼーションをプロファイラーモジュールで作りたい場合があります。たとえば、プロファイラーモジュールの詳細情報を表示する部分に、現在のフレームの画面キャプチャを表示することで、パフォーマンスデータのコンテキストをさらにわかりやすくしたい場合は、以下のようにします。
画像などの追加フレームデータをプロファイラーに送信し、その後プロファイラーのキャプチャから取得するには、Frame Metadata API の Profiler.EmitFrameMetaData と FrameDataView.GetFrameMetaData を使います。
設定データなど、プロファイリングのセッションごとに一度だけ送信する必要のある追加データがある場合、Session Metadata API の Profiler.EmitSessionMetaData および FrameDataView.GetSessionMetaData を使います。
これらの機能をいつどのように使うかの例は、上記のリンク先のドキュメンテーションをご覧ください。
この記事では、独自のパフォーマンス指標を使って、Unity プロファイラーを拡張する方法を解説しました。Profiling.Core パッケージで利用可能な新しいプロファイラーカウンタを使い、カスタムの指標を追加することに触れました。次に、プロファイラーモジュールエディターとプロファイラーモジュール API を使って、プロファイラーウィンドウにカスタムのプロファイラーモジュールを追加する方法を検討しました。最後に、プロファイラーに画像などの複雑なデータを追加で送り、よりコンテキストが豊かな情報を提供する方法について説明しました。
Unity 2021 LTS で追加されたこれらのプロファイラーの拡張機能を使ってより詳細な測定を行い、皆さんがアプリケーションがなぜそのパフォーマンスを出しているかの背景を理解できるようになることを期待しています。何かありましたら、私たちのフォーラムページを通して、お気軽にチームにご連絡ください。皆さんのご意見をいただき、Unity のパフォーマンスツールをどのように改善できるかを学びたいと思います。