Version: 2023.1
言語: 日本語
Profiler のカスタマイズ
カスタムプロファイラーモジュールの作成

カスタムのプロファイラーカウンターの作成

Unity Profiler でカスタム指標を表示するには、Unity Profiling Core パッケージに含まれる ProfilerCounter API を使用する必要があります。

Profiling Core API を使用して、アプリケーションの指標を追跡することができます。カウンターが追跡する情報は、Unity Profiler で表示できます。カスタムプロファイラーカウンターを使用して、Profiler ウィンドウでシステム指標を比較し、パフォーマンスの問題を特定します。

カスタムプロファイラーカウンターは、ProfilerCounter または ProfilerCounterValue からデータを表示することができます。

Unity Profiling Core API を使用してプロファイラーカウンターを作成する完全なガイドについては、Profiler counters API guide を参照してください。

プロファイラーカウンターを加えるには、以下を行うスクリプトを作成します。

これらのセクションのコード例では、ゲームオブジェクトのトレイル効果のインスタンスごとに Unity が作成したパーティクルの総数を追跡するプロファイラーカウンターを加えます。これらの例では、ゲームオブジェクトの名前は “Tank ”です。

カウンターの定義

新しいカウンターを作成するには、新しいカウンターの値の型を定義し、この型に名前と単位を割り当てるスクリプトを記述します。

カウンターを作成するときに、新しいカウンターが属する Profiler カテゴリ を指定する必要があります。これを行うには、既存の Unity カテゴリを使用します。例えば、以下のスクリプト例では、既存の ProfilerCategory.Scripts カテゴリを使用します。詳細については、Profiler カテゴリの使用 を参照してください。

以下のサンプルスクリプトは、ProfilerCounterValue TankTrailParticleCount を、Tank Trail Particles という名で定義しています。このカウンターの単位は “Count” です。

 
 public static class GameStats
 {
    public static readonly ProfilerCategory TanksCategory = ProfilerCategory.Scripts;

    public const string TankTrailParticleCountName = "Tank Trail Particles";
    public static readonly ProfilerCounterValue<int> TankTrailParticleCount =
        new ProfilerCounterValue<int>(TanksCategory, TankTrailParticleCountName, ProfilerMarkerDataUnit.Count,
            ProfilerCounterOptions.FlushOnEndOfFrame | ProfilerCounterOptions.ResetToZeroOnFlush);
 }

オプション FlushOnEndOfFrameResetToZeroOnFlush は、自動的にカウンターを Profiler データストリームに送り、フレームの終了時に Count 値を 0 にリセットします。

プロファイラーのカテゴリを使用する

Unity は、プロファイラーカウンターを、カウンターがプロファイルする作業の種類、たとえばレンダリング、スクリプト、アニメーションに基づいて自動的にカテゴリにグループ化します。カスタムのプロファイラーカウンターは、Unity のプロファイリングカテゴリのいずれかに割り当てることができます。利用可能なプロファイラーカテゴリの完全なリストについては、ProfilerCategory を参照してください。

プロファイラーカウンターをプロファイラーのカテゴリに割り当てる

プロファイラーカウンターは、プロファイラーカテゴリに属している必要があります。カウンターを定義するときに、プロファイラーカウンターにカテゴリーを割り当てる必要があります。これを行うには、ProfilerModule のオプションの autoEnabledCategoryNames コンストラクターの引数を使って、1 つ以上のカテゴリをプロファイラーカウンターに割り当てます。以下のサンプルコードに、この方法の例があります。


 using Unity.Profiling;
 using Unity.Profiling.Editor;

 [System.Serializable]
 [ProfilerModuleMetadata("Tank Effects")] 
 public class TankEffectsProfilerModule : ProfilerModule
 {
    static readonly ProfilerCounterDescriptor[] k_Counters = new ProfilerCounterDescriptor[]
    {
        new ProfilerCounterDescriptor(GameStatistics.TankTrailParticleCountName, GameStatistics.TanksCategory),
        new ProfilerCounterDescriptor(GameStatistics.ShellExplosionParticleCountName, GameStatistics.TanksCategory),
        new ProfilerCounterDescriptor(GameStatistics.TankExplosionParticleCountName, GameStatistics.TanksCategory),
    };

    // Ensure that both ProfilerCategory.Scripts and ProfilerCategory.Memory categories are enabled when our module is active.
    static readonly string[] k_AutoEnabledCategoryNames = new string[]
    {
        ProfilerCategory.Scripts.Name,
        ProfilerCategory.Memory.Name
    };


    // Pass the auto-enabled category names to the base constructor.
    public TankEffectsProfilerModule() : base(k_Counters, autoEnabledCategoryNames: k_AutoEnabledCategoryNames) { }
 }

カウンターの値を更新する

カウンターの値を更新するには、定義したカウンターの値を設定する MonoBehaviour スクリプトを作成します。詳しくは、プロファイラーにカウンターの値を渡す方法 を参照してください。

カウンターの値を更新するスクリプト例

この MonoBehaviour スクリプトの例では、Update 関数において、割り当てられたゲームオブジェクトに属するトレイルパーティクルの数をフレームごとに数えています。そのために TankTrailParticleCount というカウンターを使用しています。

また、以下のサンプルスクリプトでは、Trail Particle System (m_TrailParticleSystem) というパブリックプロパティを Inspactor に作成しています。


 using UnityEngine;

  class TankMovement : MonoBehaviour
  {
     public ParticleSystem m_TrailParticleSystem;

     void Update()
     {
         GameStats.TankTrailParticleCount.Value += m_TrailParticleSystem.particleCount;
     }
  }

プロファイラーカウンターを使用したリリースビルドのプロファイリング

リリースされたプレイヤーでプロジェクトを実行する場合、Profiler ウィンドウにはアクセスできません。しかし、リリースされたプレイヤーでは、UI 要素としてカウンターを表示できます。つまり、リリースされたアプリケーションにプロファイリングツールを入れることができます。これには、Profiler counters API guideGetting counter values in players を参照してください。

以下の画像は、リリースプレーヤーでカスタム UI を使用して、シーンの左上にカウンターを表示しています。

Profiler のカスタマイズ
カスタムプロファイラーモジュールの作成