Unity でアプリケーションのメモリ使用量を分析する方法は 2 つあります。
このページではビルトインの 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 ウィンドウの下部にある Simple と Detail の 2 つの表示があります。表示を変更するには、モジュール詳細ペインの左上のドロップダウンから表示を選択します。
簡易ビューでは、Unity がメモリをどのように使用しているかを、フレーム単位でリアルタイムに表示します。
Unity は OS が頻繁にメモリを要求しずぎることを防ぐため、アロケーションのためのメモリプールを確保します。プロファイラーは、予約済みのメモリの量と、Unity が使用しているメモリの量を表示します。
この情報は、ProfilerRecorder API やProfiler 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 にスクリプトを追加した結果を表しています。
この情報は、上の表の他のハイレベルなカウンターと同様に、Release Player で利用できます。選択した Memory カウンターを Profiler ウィンドウのカスタムモジュールで表示したい場合は、Module Editor を使ってチャートを設定してください。
Detailed (詳細) ビューを使用すると、アプリケーションの現在の状態のスナップショットを取得できます。Take Sample ボタンをクリックして、現在のターゲットの詳細なメモリ使用をキャプチャ ます。プロファイラーがこのデータを取得するにはかなりの時間がかかるため、Detailed ビューではリアルタイムの詳細情報は表示されません。プロファイラーがサンプルを取得した後に、Profiler ウィンドウにリストビューが表示され、そこでアプリケーションのメモリ使用を詳細に確認できます。
モジュールの詳細ペインの上部にある Gather object references 設定を有効にして、スナップショットの時点でオブジェクトを参照しているものに関する情報を収集できます。この情報は、ウィンドウの右側のペインに表示されます。
リストビューでは、メモリを使用するオブジェクトを以下のカテゴリに分類しています。
Asset または Scene Memory リストでゲームオブジェクトをクリックすると、Project またはシーンビューでハイライトされます。
ノート: Other カテゴリでは、System.ExecutableAndDlls
で報告されるメモリは読み取り専用メモリです。オペレーティングシステムは必要に応じてこれらのページを破棄し、後でファイルシステムから再ロードする場合があります。これにより、メモリ使用量が少なくなり、通常は、オペレーティングシステムがメモリを使いすぎた場合にアプリケーションを閉じるかどうかの決定に、直接影響しません。これらのページの一部は、同じフレームワークを使用している他のアプリケーションと共有される場合もあります。