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

Memory プロファイラーモジュール

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

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

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

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

エディターでアプリケーションをプロファイルすると、Memory モジュールの情報はエディターのメモリ使用を示します。これらの数値は一般的にリリースプラットフォームで実行する場合よりも大きくなります。なぜなら、Unity エディターを実行するとメモリを消費する特定のオブジェクトを使用し、エディターウィンドウ自体が余分なメモリを使用するためです。さらに、プロファイラーはプロファイラーが使用するメモリを表示します。なぜなら、Unity は再生モードのプレイヤーが使用するメモリからそれを明確に分離できないからです。 アプリケーションのより正確な数値とメモリ使用量については、Attach to Player ニューを使ってプロファイラーを実行中のプレイヤーに接続してください。 これにより、ターゲットデバイスでの実際の使用状況を確認できます。

チャートのカテゴリ

Memory モジュールは、6 つのチャートに分かれており、アプリケーションがメモリをどこで使用するかに関する詳細情報を表示します。チャートのカテゴリの順序を変更できます。これを行うには、チャートの凡例にドラッグアンドドロップします。カテゴリの色の付いた凡例をクリックして、表示を切り替えることもできます。

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

モジュールの詳細ペイン

モジュールの詳細ペインには、Profiler ウィンドウの下部にある SimpleDetail の 2 つの表示があります。表示を変更するには、モジュール詳細ペインの左上のドロップダウンから表示を選択します。

簡易ビュー

簡易ビューでは、Unity がメモリをどのように使用しているかを、フレーム単位でリアルタイムに表示します。

Unity は OS が頻繁にメモリを要求しずぎることを防ぐため、アロケーションのためのメモリプールを確保します。プロファイラーは、予約済みのメモリの量と、Unity が使用しているメモリの量を表示します。

シンプルなメモリモジュールビュー
シンプルなメモリモジュールビュー

この情報は、ProfilerRecorder APIProfiler Module Editor からも入手でき、カスタムの Profiler モジュールに追加することができます。

統計 説明 リリースプレイヤーで利用可能か
Total Used Memory Unity が使用し、追跡するメモリの合計値。
Total Reserved Memory Unity が追跡目的とプール割り当てに使用する予約済みメモリの合計。
GC Used Memory

GC Reserved Memory
マネージコードが使用する使用済みヒープサイズと総ヒープサイズ。このメモリはガベージコレクションされます。
Gfx Used Memory

Gfx Reserved Memory
ドライバーがテクスチャ、レンダーターゲット、シェーダー、メッシュデータに使用している推定メモリ量。 なし
Audio Used Memory

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

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

Profiler Reserved Memory
プロファイラー機能が使用しメモリとシステムから確保するメモリ。
System Used Memory Memory プロファイラーはシステムのすべてのメモリ使用を追跡するわけではないため、プロファイラーの値は、オペレーティングシステムのタスクマネージャーに表示される値とは異なります。これには、一部のドライバーとプラグインが使用するメモリと、実行可能コードに使用されるメモリが含まれます。

オペレーティングシステムからアプリケーションの総メモリサイズを取得することが可能なプラットフォームでは、System Memory Usage は 0 を超え、タスクマネージャーでも同じサイズです。
Texture Count

Texture Memory
ロードされたテクスチャの総数と、それらが使用するメモリ量。 なし
Mesh Count

Mesh Memory
ロードされたメッシュの総数と使用するメモリ量。 なし
Material Count

Material Memory
ロードされたメッシュの総数と使用するメモリ量。 なし
AnimationClip Count

AnimationClip Memory
ロードされたアニメーションクリップの総数と使用するメモリ量。 なし
Asset Count ロードされたアセット総数。 なし
GameObject Count シーン内の GameObject インスタンスの総数。 なし
Scene Object Count ダイナミックな UnityEngine.Object の総数です。この数には **GameObject Count** と、コンポーネントの総数、そしてシーン内でアセットではないものが含まれます。 |なし| |**Object Count**|アプリケーションが作成またはロードするネイティブのUnityEngine.Object`の総数です。この数には、Scene Object Count と、すべてのアセットの合計数が含まれます。この数値が時間とともに増加する場合、アプリケーションが GameObject やその他のアセットを作成し、それらをまったく破棄したりアンロードしたりしていないということです。 なし
GC Allocation In Frame Count

GC Allocated In Frame
マネージアロケーションの量とその合計サイズ (バイト)。 なし

プレイヤーの可用性

ProfilerRecorder API を使用して、プレイヤーのMemory プロファイラーモジュールのカウンターにアクセスすることができます。以下の例には、“Total Reserved Memory”、“GC Reserved Memory”、“System Used Memory” の指標を収集し、それらを GUI.TextArea として表示する簡単なスクリプトが含まれています。メモリプロファイラモジュールの情報は、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! チュートリアル。メモリ情報のオーバーレイが表示されています。

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

Detailed ビュー

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

メモリモジュールの詳細ビュー
メモリモジュールの詳細ビュー

モジュールの詳細ペインの上部にある 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 プロファイラーモジュール