Version: 2021.2
言語: 日本語
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 割り当て数も確認できます。

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

When you profile your application in the Editor, rather than building and profiling your application on a target device, the profiling data in the Memory Profiler module is larger than when you run your application on its release platform. This is because the Unity Editor uses specific objects that take up memory, and the Editor window itself uses extra memory.

Also, because Unity can’t cleanly separate the memory that the Profiler itself takes up from the Play mode’s memory, memory that the Profiler uses is displayed in the Profiler window. To remind you of this, a warning displays at the top of the Memory Profiler module details pane whenever you have the Profiler target set to Play Mode or Editor. For more precise numbers and memory usage for your application, you should profile your application on the target device and operating system you intend it to run on. For more information, see the documentation on Profiling your application.

チャートのカテゴリ

The Memory Profiler module has a number charts that display detailed information on where your application spends memory. You can change the order of the categories in the chart; to do this, drag them in the chart’s legend. You can also click a category’s colored legend to toggle its display.

カテゴリ 説明 
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 ビュー

The Simple view displays an overview of how Unity uses memory in real-time on a per-frame basis. It displays the data that code marked with the System Used Memory profiler counter collects, which indicates how much memory the operating system (OS) reports as being in use by your application.

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

Unity sets some memory pools aside for allocations to avoid asking the operating system for memory too often. The Profiler module displays how much memory Unity reserves, and how much Unity it used at the time of the Profiler capture.

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

Be aware that the values in the Profiler are different to those displayed in your operating system’s task manager, because the Memory Profiler doesn’t track all memory usage in your system. This includes memory that some drivers and plug-ins use, and memory used for executable code.

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) The used heap size and total heap size that managed code uses. This memory is garbage collected. 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 Displays memory that Unity tracks, but isn’t reported under a specific counter.

To get more information on the makeup of this or the other categories, take a snapshot in the Detailed view or with the Memory Profiler package.

Important: The Other category doesn’t directly map to the Other group in the Detailed view.
該当なし 該当なし
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 Displays the amount of managed allocations and its total size in bytes. 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 プロファイラーモジュール