概要
UnityやC#にはメモリ量を取得する関数がいくつかありますが、関数の種類が多く特定の環境でしか使えない関数もあったりして複雑なのでまとめてみました。Windows、Mac、iOS、Androidで確認しています。
取得方法まとめ
| 取れる値 | 関数 | ||
|---|---|---|---|
| デバイス | メモリ量 | SystemInfo.systemMemorySize (取れるのはおおよその値。MB単位) | |
| ビデオメモリ量 | SystemInfo.graphicsMemorySize (取れるのはおおよその値。MB単位) | ||
| アプリ全体 | ※長くなるので後述 | ||
| Unity Memory (リソースなど) | 全体 | Profiler.GetTotalReservedMemoryLong | |
| 使用量 | Profiler.GetTotalAllocatedMemoryLong Profiler.usedHeapSizeLong (MacのEditor以外ではどちらも同じ値) | ||
| Profiler.GetTotalUnusedReservedMemoryLong | |||
| Mono Heap (Scriptからnewしたものなど) | 全体 | Profiler.GetMonoHeapSizeLong | |
| 使用量 | Profiler.GetMonoUsedSizeLong GC.GetTotalMemory(false) (どちらも同じ値が取れる) | ||
| Graphic Driver | Profiler.GetAllocatedMemoryForGraphicsDriver (Editor、Development Buildのみ有効) | ||
| その他 | UnityEngine.Objectのサイズ (GameObjectやSpriteなど) | Profiler.GetRuntimeMemorySizeLong (Editor、Development Buildのみ有効) | |
※ Profiler名前空間の関数でもGetAllocatedMemoryForGraphicsDriverとGetRuntimeMemorySizeLong以外はDevelopment Build無しで使えます
※ MacのEditorではusedHeapSizeLongがGetTotalReservedMemoryLongを超える値になっていました。どんな理由にせよEditorのメモリ使用量はあまり参考にならないので詳しく調査していません
アプリ全体のメモリ使用量の取得
アプリ全体のメモリ使用量に関しては何故かどの環境でも簡単に取得できる方法が用意されていません。多くの環境ではNative Pluginを実装することになります。
| 環境 | 取得方法 | ||
|---|---|---|---|
| Windows | Editor | Native Pluginを実装。 詳しくは『Windowsアプリのメモリ使用量を取得する』参照。 | |
| Standalone | IL2CPP | ||
| Mono | |||
| Mac | Editor | Process.GetCurrentProcess().WorkingSet64 (アクティビティモニタの「実メモリ」と同じ値) | |
| Standalone | Mono | ||
| IL2CPP | |||
| iOS | IL2CPP | Native Pluginを実装。 詳しくは『iOSでアプリのメモリ使用量を取得する』参照。 | |
| Android | IL2CPP | Native PluginかAndroidJavaClassで実装。 詳しくは『Native Pluginを作らずにAndroidアプリのメモリ使用量を取得する』参照。 (MonoのみProcess.GetCurrentProcess() .WorkingSet64でも取れます) | |
| Mono | |||
※ ちなみに System.Environment.WorkingSetはどの環境でも0を返しました
※ 細かい話をすると共有メモリや仮想メモリなどの種類があり、どの値が欲しいかによっては上記の実装そのままではダメな可能性があります。