Version: 2021.2
言語: 日本語
特殊な最適化
アセットワークフロー

アセットローディングメトリクス

AsyncReadManagerMetrics クラスを使用して、ランタイムのアセットのロードとファイル読み込みのパフォーマンスを監視します。このクラスは、AsyncReadManager によって管理されるすべてのファイル読み込み操作に関するデータを記録します。

Unity エンジンは、AsyncReadManager を使用して、ランタイムにほとんどのファイルを読み込みます。AsyncReadManager で読み込まれるファイルには、アセットバンドル、Addressable、リソースなどがあります。さらに、AsyncReadManager.Read を使用してスクリプトからファイルを読み込むことができます。

AsyncReadManagerMetrics クラスを使用すると、メトリクス (指標となるデータ) の収集を有効にして、記録されたメトリクスデータを取得することができます。また、記録されたデータをフィルタリングしたり、要約したりして分析に役立てることができます。このメトリクス情報は、アセットローディングに関する問題領域の特定や、変更がアセットローディングのパフォーマンスに与える影響の計測に役立ちます。

AsyncReadManagerMetrics クラスは、開発ビルドで のみ 利用可能です。AsyncReadManagerMetrics API の呼び出しは、 ENABLE_PROFILER シンボルを使用して #if プリプロセッサーディレクティブの中で囲う必要があります。ENABLE_PROFILER シンボルは開発用ビルドでのみ定義されています。これにより、メトリクスが利用できないビルドでもスクリプトをコンパイルすることができます。後方互換を行うために、UNITY_2020_2_OR_NEWER シンボルを使用して、Unity の以前のバージョンからメトリクスのコードを削除することもできます。例えば、以下のようになります。

# if ENABLE_PROFILER && UNITY_2020_2_OR_NEWER
    AsyncReadManagerMetrics.StartCollectingMetrics();
# endif

メトリクス収集を可能にする

データが記録される前に、メトリクス収集を可能にする必要があります。以下のいずれかの方法で、メトリクス収集を可能にします。

ノート: Unity エディターアプリケーションの起動時に -enable-file-read-metrics を渡すことで、再生モードに入る際に収集を有効にすることができます。ただし、エディターはテクスチャなどの一部のカテゴリーのアセットをエディター自体でロードし、再生モードに入るときには再ロードしません。ファイル IO メトリクスの全体像を把握するには、アプリケーションの開発ビルドからデータを収集する必要があります。

メトリックスデータの取得

AsyncReadManagerMetrics クラスによって集められたメトリクスを、GetMetrics を呼び出して取得します。この関数に AsyncReadManagerMetrics.Flags を渡して、取得後にメトリクスを消去するかどうかを指定します。メトリクスを消去すると、保存されているメトリクスからすべての完了した (キャンセルされたものや失敗したものを含む) 読み込みが削除されます。消去は、キューに入っている操作や処理中の操作には影響しません。操作が未完了のメトリクスには、その操作が完了した後に GetMetrics を再度呼び出すとアクセスできます。メトリクスを定期的に消去することで、同じデータの再読み込みを避け、システムのデータオーバーヘッドを削減することができます。

# if ENABLE_PROFILER && UNITY_2020_2_OR_NEWER
    AsyncReadManagerRequestMetric[] metrics 
        = AsyncReadManagerMetrics.GetMetrics(AsyncReadManagerMetrics.Flags.ClearOnRead);
# endif

可能な場合は、メトリックデータには読み込み操作に関するコンテキスト情報が含まれています。この情報には、読み込みを要求した AssetLoadingSubsystemAssetNameAssetTypeID が含まれます。AsyncReadManager がこの情報にアクセスできない場合、これらのメトリクスフィールドの値は、それぞれ Other、空白、0 です。

ノート: 現在サポートされている Asset TypeID は以下の表のとおりです。その他の TypeID については、YAML Class ID Reference を参照してください。

TypeID 型名
28 Texture2D
117 Texture3D
89 CubeMap
43 Mesh

サマリーデータの取得

AsyncReadManager メトリクスのサマリー (要約) は、以下のメソッドで取得できます。

例:

# if ENABLE_PROFILER && UNITY_2020_2_OR_NEWER
    AsyncReadManagerSummaryMetrics summaryOfMetrics 
        = AsyncReadManagerMetrics.GetCurrentSummaryMetrics(AsyncReadManagerMetrics.Flags.ClearOnRead);
# endif

または

# if ENABLE_PROFILER && UNITY_2020_2_OR_NEWER
    AsyncReadManagerRequestMetric[] metrics 
        = AsyncReadManagerMetrics.GetMetrics(AsyncReadManagerMetrics.Flags.ClearOnRead);
    AsyncReadManagerSummaryMetrics summaryOfMetrics 
        = AsyncReadManagerMetrics.GetSummaryOfMetrics(metrics);
# endif

メトリクスのサマリーデータには、以下のような統計情報が含まれます。

  • 平均帯域幅
  • 平均読み込みサイズ
  • ロード時間が最も長いアセットタイプ
  • 読み込み数
  • リクエスト数
  • 読み込んだバイトの総数

(完全なリストは、AsyncReadManagerSummaryMetrics を参照してください。)

デフォルトでは、キューに入っているものや進行中のものも含めて、すべての読み込み操作が集計されます。フィルターを使用して、特に関心のある操作のサマリーに限定することができます。例えば、フィルターを使って、完了したテクスチャアセットの読み込み操作に限定して統計をまとめることができます。

ノート: サマリー統計を計算するには処理リソースが必要です。これらの計算が記録中の計測値を変更しないようにするためには、まず計測値を収集し、分析操作の終了後にサマリーを取得します。

サマリーフィルター

AsyncReadManagerMetricsFilters を以下のメソッドのいずれかと一緒に使用して、要約するデータタイプを指定します。フィルターに一致しないメトリクスは、サマリーから除外されます。以下のカテゴリでフィルタリングできます。

同じフィルターに複数のカテゴリを設定できます。読み込み操作がすべてのカテゴリに一致しないと、その操作のメトリクスはサマリーに含まれません。例えば、フィルターの ProcessingStateSubsystem の両方に値を指定して、指定されたサブシステムによって開始された指定された処理状態の操作のみを要約することができます。

1 つのカテゴリに複数の値を指定することもできます。この場合、読み取り操作は、サマリーに含まれるメトリックスのカテゴリに指定したどの値とも一致する可能性があります。例えば、メッシュテクスチャ の両方を サブシステム カテゴリに指定すると、メッシュと テクスチャの両方のアセットのオペレーションを要約することができます。

特殊な最適化
アセットワークフロー