Cooooding!!

Unity(C#)を使ったゲーム開発関連Tipsなど

Unityで使えるメモリ量を取得する方法まとめ

概要

UnityやC#にはメモリ量を取得する関数がいくつかありますが、関数の種類が多く特定の環境でしか使えない関数もあったりして複雑なのでまとめてみました。WindowsMaciOSAndroidで確認しています。

取得方法まとめ

取れる値関数
バイスメモリ量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 DriverProfiler.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を実装することになります。

環境取得方法
WindowsEditorNative Pluginを実装。
詳しくは『Windowsアプリのメモリ使用量を取得する』参照。
StandaloneIL2CPP
Mono
MacEditorProcess.GetCurrentProcess().WorkingSet64
(アクティビティモニタの「実メモリ」と同じ値)
StandaloneMono
IL2CPPNative Pluginで取れそうだけど使う予定がないので未検証
iOSIL2CPPNative Pluginを実装。
詳しくは『iOSでアプリのメモリ使用量を取得する』参照。
AndroidIL2CPPNative PluginかAndroidJavaClassで実装。
詳しくは『Native Pluginを作らずにAndroidアプリのメモリ使用量を取得する』参照。
(MonoのみProcess.GetCurrentProcess() .WorkingSet64でも取れます)
Mono

※ ちなみに System.Environment.WorkingSetはどの環境でも0を返しました
※ 細かい話をすると共有メモリや仮想メモリなどの種類があり、どの値が欲しいかによっては上記の実装そのままではダメな可能性があります。

環境

  • Unity2019.2
  • Windows10
  • Mac Mojave
  • Nexus 5X (Android 6.0.1)
  • iPhoneXS (iOS13.3)
  • iPhone7 (iOS11.2.6)
  • iPhone6 (iOS9.3.5)