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

> Monitor asset loading at runtime.

[AsyncReadManagerMetrics](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-metrics.md) クラスを使用して、ランタイムのアセットのロードとファイル読み込みのパフォーマンスを監視します。このクラスは、[AsyncReadManager](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager.md) によって管理されるすべてのファイル読み込み操作に関するデータを記録します。

Unity エンジンは、ランタイムのほとんどのファイル読み込みに [AsyncReadManager](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager.md) を使用します。AsyncReadManager で読み込まれるファイルには、アセットバンドル、Addressables、リソースなどがあります。さらに、[AsyncReadManager.Read](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager/read.md) を使用してスクリプトからファイルをロードできます。

[AsyncReadManagerMetrics](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-metrics.md) クラスを使用すると、メトリクスの収集を有効にして、記録されたメトリクスデータを取得することができます。また、記録されたデータをフィルタリングしたり、要約したりして分析に役立てることができます。このメトリクス情報は、アセットローディングに関する問題領域の特定や、変更がアセットローディングのパフォーマンスに与える影響の計測に役立ちます。

[AsyncReadManagerMetrics](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-metrics.md) クラスは開発ビルドで *のみ* 使用できます。AsyncReadManagerMetrics API の呼び出しは、`ENABLE_PROFILER` シンボルを使用して #if プリプロセッサーディレクティブ内で保護する必要があります。`ENABLE_PROFILER` シンボルは開発ビルドに対してのみ定義されるため、メトリクスが使用できないビルドでもスクリプトをコンパイルできます。後方互換性のために、`UNITY_2020_2_OR_NEWER` シンボルを使用して以前のバージョンの Unity からメトリクスコードを削除することもできます。 例:

```lang-cs
#if ENABLE_PROFILER && UNITY_2020_2_OR_NEWER
    AsyncReadManagerMetrics.StartCollectingMetrics();
#endif
```

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

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

* [AsyncReadManagerMetrics.StartCollectingMetrics](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-metrics/start-collecting-metrics.md) を呼び出す。
* アプリケーションの起動時に **-enable-file-read-metrics** をコマンドライン引数として渡す。

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

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

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

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

可能な場合、メトリクスデータには読み込み操作に関するコンテキスト情報が加えられます。この情報には、読み込みをリクエストした [AssetLoadingSubsystem](/engine/6000.0/script-reference/unity-io-low-level-unsafe/asset-loading-subsystem.md)、[AssetName](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-request-metric/asset-name.md)、[AssetTypeID](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-request-metric/asset-type-id.md) が含まれます。AsyncReadManager がこの情報にアクセスできない場合、これらのメトリクスフィールドの値は、それぞれ [Other](/engine/6000.0/script-reference/unity-io-low-level-unsafe/asset-loading-subsystem/other.md)、空白、0 です。

\_\_注意\_\_現在サポートされている Asset TypeID は以下の表のとおりです。その他の TypeID については、[YAML Class ID Reference](/engine/6000.0/manual/unity-editor/editor-features/text-scene-format/class-idreference.md) を参照してください。

| TypeID | 型名        |
| ------ | --------- |
| 28     | Texture2D |
| 117    | Texture3D |
| 89     | CubeMap   |
| 43     | Mesh      |

## サマリーデータの取得

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

* [GetCurrentSummaryMetrics](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-metrics/get-current-summary-metrics.md) -- 保存されたメトリクスを最後に消去したとき以降に収集されたすべてのメトリクスのサマリーを返します。
* [GetSummaryOfMetrics](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-metrics/get-summary-of-metrics.md) -- [GetMetrics](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-metrics/get-metrics.md) を呼び出すことで取得できる [AsyncReadManagerRequestMetric](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-request-metric.md) の配列でメトリクスのサマリーを返します。

例:

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

または

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

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

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

(完全なリストについては、[AsyncReadManagerSummaryMetrics](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-summary-metrics.md) を参照してください)。

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

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

### サマリーフィルター

[AsyncReadManagerMetricsFilters](/engine/6000.0/script-reference/unity-io-low-level-unsafe/async-read-manager-metrics-filters.md) をこれらのメソッドのいずれかとともに使用すると、要約するデータの種類を指定できます。フィルターに一致しないメトリクスは、サマリーから除外されます。以下のカテゴリでフィルタリングできます。

* アセットタイプ ([YAML ID](/engine/6000.0/manual/unity-editor/editor-features/text-scene-format/class-idreference.md))
* [処理状態](/engine/6000.0/script-reference/unity-io-low-level-unsafe/processing-state.md) (読み込み操作がキューの状態か、読み込み中か、完了しているかなど)
* [読み込みタイプ](/engine/6000.0/script-reference/unity-io-low-level-unsafe/file-read-type.md) (非同期または同期)
* [優先度](/engine/6000.0/script-reference/unity-io-low-level-unsafe/priority.md) (高または低)
* サブシステム ([AssetLoadingSubsystem](/engine/6000.0/script-reference/unity-io-low-level-unsafe/asset-loading-subsystem.md))

同じフィルターに複数のカテゴリを設定できます。読み込み操作がすべてのカテゴリに一致しないと、その操作のメトリクスはサマリーに加えられません。例えば、フィルターの [ProcessingState](/engine/6000.0/script-reference/unity-io-low-level-unsafe/processing-state.md) と [Subsystem](/engine/6000.0/script-reference/unity-io-low-level-unsafe/asset-loading-subsystem.md) の両方に値を指定して、指定されたサブシステムによって開始される、指定された処理状態の操作のみを要約することができます。

1 つのカテゴリに複数の値を指定することもできます。この場合、読み込み操作は、カテゴリに指定したすべての値を照合して、そのメトリクスをサマリーに追加します。例えば、[Subsystem](/engine/6000.0/script-reference/unity-io-low-level-unsafe/asset-loading-subsystem.md) カテゴリに [メッシュ](/engine/6000.0/script-reference/unity-io-low-level-unsafe/asset-loading-subsystem/mesh.md) と [テクスチャ](/engine/6000.0/script-reference/unity-io-low-level-unsafe/asset-loading-subsystem/texture.md) の両方を指定して、メッシュとテクスチャの両方のアセットの操作を要約することができます。
