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