Version: 2022.1
言語: 日本語
GPU Usage Profiler モジュール
Physics プロファイラーモジュール

Memory Profiler モジュール

Unity でアプリケーションのメモリ使用量を分析する方法は 2 つあります。

  • Memory Profiler モジュール: このビルトインの Profiler モジュールは、アプリケーションのメモリを何に使用しているかの基本的な情報を提供します。
  • Memory Profiler パッケージ: プロジェクトに追加できる Unity パッケージです。これにより、Unity エディターに Memory Profiler ウィンドウが追加され、アプリケーションのメモリ使用をさらに詳細に分析することができます。スナップショットを保存して比較することで、メモリリークを発見したり、メモリレイアウトを確認してメモリの断片化の問題を発見することができます。

このページではビルトインの Memory プロファイラーモジュールについて説明します。Memory Profiler パッケージの詳細は、Memory Profiler のドキュメント を参照してください。

Memory Profiler モジュールは、アプリケーションに割り当てられたすべてのメモリを表すカウンターを視覚化します。メモリモジュールを使用して、ロードされたオブジェクトの数や、カテゴリごとの合計メモリに占める使用量などの情報を確認できます。プロファイラーフレームごとの GC 割り当て数も確認できます。

エディターのメモリプロファイリング

エディターでアプリケーションを分析すると、Memory Profiler モジュールは、ターゲットデバイスでビルドされたアプリケーションの同様のプロファイルよりも高いデータ使用量を報告します。これは、Unity エディターがメモリを消費する特定のオブジェクトを使用し、エディターウィンドウ自体が余分なメモリを使用するためです。

余分なメモリ使用の一部は、Unity がテクスチャのようなオブジェクトをエディター内で読み取り/書き込み可能として扱い、CPU 上に各テクスチャの余分なコピーを保持するためです。これにより、報告されるエディター内テクスチャのメモリ使用量は、実質 2 倍になります。テクスチャによるメモリ使用量をより正確に知るには、ターゲットプラットフォーム上で動作するアプリケーションのビルドバージョンをプロファイルしてください。

また、Unity は Profiler 自体が使用するメモリと Play モードのメモリをはっきり分離できないため、Profiler が使用するメモリは Profiler ウィンドウに表示されます。このことを忘れないように、Profiler のターゲットを Play Mode または Editor に設定すると、Memory Profiler モジュールの詳細ペインの上部に警告が表示されます。アプリケーションのより正確な数値とメモリ使用量については、実行する予定のターゲットデバイスとオペレーティングシステム上でアプリケーションをプロファイルする必要があります。詳細については、アプリケーションをプロファイルする のドキュメントを参照してください。

チャートのカテゴリ

Memory Profiler モジュールはカテゴリに分かれており、それぞれに関してアプリケーションがメモリを消費する詳細情報を表示します。また、カテゴリの色のついた凡例をクリックすると、その表示が切り替わります。

カテゴリ 説明 
Total Allocated アプリケーションが使用する合計メモリ
Texture Memory アプリケーションの テクスチャ が使用するメモリ量
Mesh Memory アプリケーションの メッシュ が使用するメモリ量
Material Count アプリケーションの マテリアル のインスタンス数
Object Count アプリケーションのネイティブのオブジェクトのインスタンス数
GC Used Memory GC ヒープ が使用するメモリ量
GC Allocated in Frame GC ヒープのフレームごとに割り当てられたメモリ量

モジュールの詳細ペイン

Profiler ウィンドウの下部にあるモジュール詳細ペインでは、2 つのビューが利用可能です。

  • Simple: フレームごとのメモリ統計の概要を高水準で表示します。
  • Detailed: ネイティブのオブジェクトが使用するメモリ (それらへのネイティブの参照を含む) と Unity の異なるサブシステムに関するより詳細な情報を含むメモリスナップショットをキャプチャします。

ビューを変更するには、モジュールの詳細ペインの左上にあるドロップダウンから選択します。

Simple ビュー

Simple ビューは、Unity がフレーム単位でメモリをどのように使用しているかの概要をリアルタイムに表示します。アプリケーションが使用する総メモリ量をいくつかの主要なカテゴリに分類します。Total 値は、System Used Memory Profiler カウンターに基づいており、オペレーティングシステム (OS) がアプリケーションによって使用されていると報告するメモリ量を示しています。

Profiler データがいくつか表示されている Simple ビュー
Profiler データがいくつか表示されている Simple ビュー

Unity は、OS に対して頻繁にメモリを要求することを防ぐため、割り当てのためのメモリプールを別に確保します。Profiler モジュールは、Unity が予約するメモリの量、および Profiler のキャプチャ時に Unity が使用したメモリの量を表示します。

Simple ビューには、 System Used Memory Profiler カウンター 内で収集されたデータが表示されます。これは、アプリケーションによって使用されている OS が報告するメモリ量を示し、Total Committed Memory バーと Total Memory Breakdown バーの Total 値に対応します。

OS からアプリケーションの総メモリ容量を取得することをサポートしているプラットフォームでは、 システムメモリ使用量 は 0 を超え、タスクマネージャーと同じサイズになります。

以下の表は、Simple ビューで利用可能な統計情報と、それに対応するプロファイラーカウンター、およびリリースビルドで利用可能な統計情報について説明しています。この情報は、ProfilerRecorder API を通じて、または、Profiler Module Editor でも利用可能なので、カスタムの Profiler モジュールに追加することができます。

プロパティ 説明  対応するプロファイラーカウンター リリースプレイヤーで利用可能か
Normalize この設定を有効にすると、Total Committed MemoryTotal Memory Breakdown チャートが、選択したフレームのメモリ使用量にスケールされます。この設定を無効にすると、チャートはフレーム範囲内の合計使用メモリに対してスケールされます。この設定は、フレームによってメモリの合計量または相対量がどのように変化するかを確認するのに役立ちます。 該当なし 該当なし
Total Committed Memory Total Committed Memory バーの長さは、Unityのメモリマネージャシステムが追跡したメモリの総量、そのうちのどれだけ使用したか、そしてこのシステムを通じて追跡されていないメモリの量を示します。 System Used Memory はい
Tracked Memory (in use / Reserved) Unity が使用し追跡するメモリ量 (in use)、および Unity が追跡目的およびプール割り当てのために確保するメモリ量 (Reserved) の合計を示します。 Total Used Memory

Total Reserved Memory
はい
Untracked Memory Unity が使用しているが認識していないメモリの総量を示します。追跡されていないメモリの例は、以下のとおりです。

- ネイティブプラグインや一部のドライバーを通じて割り当てられたメモリ
- Mono または IL2CPP タイプメタデータ
- 実行コードと DLL が使用するメモリ

Memory Profiler パッケージ とネイティブのプラットフォームプロバイダーは、これらの追跡されていないメモリ量の一部に関する詳細な情報を持っている場合があります。
該当なし 該当なし
Total Memory Breakdown Total Committed Memory バーと同じ合計量を表示しますが、Unity がどのサブシステムにメモリを割り当てたかに基づいて、いくつかのハイレベルなカテゴリに分割します。

すべてのメモリシステムがプールを使用しているわけではなく、使用済みメモリと予約済みメモリを区別しているわけでもありません。これらのシステムでは、使用済みと予約済みという 2 つの数字が表示されます。使用量が予約量と同じ単位 (B、MB、GB) でない場合、Unity はその単位を表示し、そうでない場合は省略します。
System Used Memory はい
Managed Heap (in use / Reserved) マネージコードが使用する使用済みヒープサイズと総ヒープサイズ。このメモリは ガベージコレクション されます。 GC Used Memory

GC Reserved Memory
はい
Graphics & Graphics Driver ドライバーがテクスチャ、レンダーターゲット、シェーダー、メッシュデータに使用する推定メモリ量。 Gfx Used Memory

Gfx Reserved Memory
いいえ
Audio オーディオシステムの推定メモリ使用量。 Audio Used Memory

Audio Reserved Memory
はい
Video ビデオシステムの推定メモリ使用量。 Video Used Memory

Video Reserved Memory
はい
Other Unity が追跡しているが、特定のカウンターで報告されないネイティブのメモリが表示されます。

このカテゴリやその他のカテゴリの構成に関する詳細な情報を得るには、Detailed ビュー または Memory Profiler パッケージでスナップショットを取得します。

重要: Other カテゴリは、 Detailed ビューの Other グループに直接マップされるわけではありません。このビューでは、 Other には、GPU 側のグラフィックスメモリ、Profiler、Audio、または Video メモリに使用されていない残りのネイティブメモリが含まれます。
該当なし 該当なし
Profiler プロファイラー機能が使用しメモリとシステムから確保するメモリ。 Profiler Used Memory

Profiler Reserved Memory
はい
Objects stats 一般的にメモリの高い割合を占めるアセットタイプ (Textures、Meshes、Materials、Animation Clips) のオブジェクトインスタンスの量と、メモリ内の累積サイズ (Assets、 GameObjects、Scene Objects) が表示されます。

ノート: Texture と Mesh メモリは、 Total Memory Breakdown ビューの Graphics & Graphics Driver 統計に直接マップされません。これは、そのメモリの一部が、Total Memory Breakdown バーの Other カテゴリにも該当する可能性があるためです。
Object Count いいえ
Textures ロードされたテクスチャの総数と、それらが使用するメモリ量。 Texture Count

Texture Memory
いいえ
Meshes ロードされたメッシュの総数と使用するメモリ量。 Mesh Count

Mesh Memory
いいえ
Materials ロードされたマテリアルの総数と使用するメモリ量。 Material Count

Material Memory
いいえ
Animation Clips ロードされたアニメーションクリップの総数と使用するメモリ量。 AnimationClip Count

AnimationClip Memory
いいえ
Assets ロードされたアセット総数。 Asset Count いいえ
Game Objects シーン内の GameObject インスタンスの総数。 GameObject Count いいえ
Scene Objects 動的な UnityEngine.Objects の総数です。この数には GameObject Count と、コンポーネントの総数、そしてシーン内でアセットではないものが含まれます。 Scene Object Count いいえ
GC Allocated In Frame 選択したフレームのマネージ割り当ての量と、その合計サイズをバイト単位で表示します。 GC Allocation In Frame Count

GC Allocated In Frame
いいえ

プレイヤーの可用性

ProfilerRecorder API を使用して、プレイヤーの Memory Profiler モジュールのカウンターにアクセスできます。以下の例には、Total Reserved MemoryGC Reserved MemorySystem Used Memory の指標を収集し、それらを GUI.TextArea として表示する簡単なスクリプトが含まれています。Memory Profiler モジュールの情報は、ProfilerCategory.Memory Profiler カテゴリに属します。

using System.Text;
using Unity.Profiling;
using UnityEngine;

public class MemoryStatsScript : MonoBehaviour
{
    string statsText;
    ProfilerRecorder totalReservedMemoryRecorder;
    ProfilerRecorder gcReservedMemoryRecorder;
    ProfilerRecorder systemUsedMemoryRecorder;

    void OnEnable()
    {
        totalReservedMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Total Reserved Memory");
        gcReservedMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "GC Reserved Memory");
        systemUsedMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "System Used Memory");
    }

    void OnDisable()
    {
        totalReservedMemoryRecorder.Dispose();
        gcReservedMemoryRecorder.Dispose();
        systemUsedMemoryRecorder.Dispose();
    }

    void Update()
    {
        var sb = new StringBuilder(500);
        if (totalReservedMemoryRecorder.Valid)
            sb.AppendLine($"Total Reserved Memory: {totalReservedMemoryRecorder.LastValue}");
        if (gcReservedMemoryRecorder.Valid)
            sb.AppendLine($"GC Reserved Memory: {gcReservedMemoryRecorder.LastValue}");
        if (systemUsedMemoryRecorder.Valid)
            sb.AppendLine($"System Used Memory: {systemUsedMemoryRecorder.LastValue}");
        statsText = sb.ToString();
    }

    void OnGUI()
    {
        GUI.TextArea(new Rect(10, 30, 250, 50), statsText);
    }
}

以下のスクリーンショットは、Tanks! tutorial project にスクリプトを追加した結果を表しています。

Tanks! チュートリアル。メモリ情報のオーバーレイが表示されています。
Tanks! チュートリアル。メモリ情報のオーバーレイが表示されています。

この情報は、上の表の他のハイレベルなカウンターと同様に、リリースプレイヤーで利用できます。選択したメモリカウンターを Profiler ウィンドウのカスタムモジュールで表示したい場合は、Module Editor を使ってチャートを設定してください。

Detailed ビュー

Detailed (詳細) ビューを使用すると、アプリケーションの現在の状態のスナップショットを取得できます。Take Sample ボタンをクリックすると、現在のターゲットの詳細なメモリ使用をキャプチャできます。プロファイラーがこのデータを取得するにはかなりの時間がかかるため、Detailed ビューではリアルタイムの詳細情報は表示されません。プロファイラーがサンプルを取得した後に、Profiler ウィンドウにリストビューが表示され、そこでアプリケーションのメモリ使用を詳細に確認できます。

メモリモジュールの Detailed ビュー
メモリモジュールの Detailed ビュー

モジュールの詳細ペインの上部にある Gather Object References 設定を有効にすると、スナップショットの時点でオブジェクトを参照するものに関する情報を収集できます。この情報は、ウィンドウの右側のペインに表示されます。

リストビューでは、メモリを使用するオブジェクトを以下のカテゴリに分類しています。

  • Other: アセット、ゲームオブジェクト、コンポーネントのいずれでもないオブジェクト。Unity が異なるシステムで使用するメモリなどの情報が含まれます。
  • Not Saved: DontSave とマークされたオブジェクト。
  • Builtin Resources: Unity エディターリソース、または Unity のデフォルトリソース。例えば、Graphics 設定の Always Included Shaders リストに加えたシェーダーなど。
  • Assets: ユーザーやネイティブコードから参照されるアセット
  • Scene Memory: オブジェクトとアタッチされたコンポーネント

Asset または Scene Memory リストでゲームオブジェクトをクリックすると、Project ビューまたはシーンビューでハイライトされます。

ノート: Other カテゴリでは、System.ExecutableAndDlls で報告されるメモリは読み取り専用メモリです。オペレーティングシステムは必要に応じてこれらのページを破棄し、後でファイルシステムから再ロードする場合があります。これにより、メモリ使用量が少なくなり、通常は、オペレーティングシステムがメモリを使いすぎた場合にアプリケーションを閉じるかどうかの決定に、直接影響しません。これらのページの一部は、同じフレームワークを使用している他のアプリケーションと共有される場合もあります。

GPU Usage Profiler モジュール
Physics プロファイラーモジュール