Unity でアプリケーションのメモリ使用量を分析する方法は 2 つあります。
このページではビルトインの 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 つのビューが利用可能です。
ビューを変更するには、モジュールの詳細ペインの左上にあるドロップダウンから選択します。
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.
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 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) | 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 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
で報告されるメモリは読み取り専用メモリです。オペレーティングシステムは必要に応じてこれらのページを破棄し、後でファイルシステムから再ロードする場合があります。これにより、メモリ使用量が少なくなり、通常は、オペレーティングシステムがメモリを使いすぎた場合にアプリケーションを閉じるかどうかの決定に、直接影響しません。これらのページの一部は、同じフレームワークを使用している他のアプリケーションと共有される場合もあります。