【Unity】Memory Profilerでメモリにロードされているオブジェクトを可視化する

UnityのMemory Profilerの基本的な使い方をまとめました。

Unity2018.4.0
Memory Profiler 0.1.0-preview

Memory Profiler?

Memory ProfilerはUnityの公式ツールで、メモリの情報を視覚的に表示できます。
インストールはPackage Managerから行えます。
この記事の執筆時点ではまだPreview版です。

f:id:halya_11:20190526013823p:plain

モバイル端末でもDevelopment Buildであれば使えるようですが、
このツール自体メモリを食うので、メモリがギリギリの状況で使用するとツールのせいで落ちたりするかもしれません。

またエディタで使う場合には、ゲーム用のリソースの他にエディタ用のリソースなども表示されてしまうので注意が必要です。

メモリをキャプチャする

Memory Profilerでメモリの状況を見るには、まずメモリをキャプチャする必要があります。
Window > Analysis > Memory Profilerからウィンドウを開きます。

f:id:halya_11:20190526014111p:plain

ウィンドウを開いたらゲームを再生し、ツールバーのCapture Playerボタンを押します。

f:id:halya_11:20190526014236p:plain

左側のビューに項目が追加されればキャプチャ成功です。
歯車マークからキャプチャの名前を変更したり、削除したりできます。

f:id:halya_11:20190526014413p:plain

Tree Mapで型ごとにメモリに占める割合を可視化

キャプチャの右のOpenボタンをクリックすると、Tree Mapが開きます。

f:id:halya_11:20190526014641p:plain

これはそれぞれの型のオブジェクトがメモリに占める割合を可視化したものです。
型名をクリックすると詳細が見れます。
例えばShaderをクリックするとこんな感じになります。

f:id:halya_11:20190526014754p:plain

Memory Mapでメモリのレイアウトを可視化

ツールバーからTree MapをMemory Mapに切り替えると、
メモリのレイアウトを可視化することができます。

f:id:halya_11:20190526014837p:plain

Memory Mapではツールバーの右上で一行当たりがメモリ上の何MBを表すかを変更したりできます。

f:id:halya_11:20190526015123p:plain

二つのキャプチャを比較するDiff

あるキャプチャをOpenしたままもう一つのキャプチャをOpenすると、
左側のウィンドウ下部のDiffボタンがアクティブになります。

f:id:halya_11:20190526015459p:plain

Diffボタンを押すと二つのキャプチャのオブジェクトを比較するビューになります。

f:id:halya_11:20190526015652p:plain

DiffカラムがSameのものは変わっていないもの、Deletedは削除されたもの、Newは新規生成されたものです。

また、ツールバーからMemory Map Diffモードを選択すると、メモリレイアウト上の差分を見ることができます。

f:id:halya_11:20190526015804p:plain

Diffで新規生成された大きいオブジェクトを特定する

Diff表示中にDiffカラムをGroupモードに切り替えることができます。

f:id:halya_11:20190526020845p:plain

これを行うと、Diffの種類ごとにグループ化が行われるので見やすくなります。

f:id:halya_11:20190526020930p:plain

今回は生成されたオブジェクトが638個、削除されたオブジェクトが208個あるようです。
生成されたオブジェクトの中にはUnityが内部的に生成しているものも多数あります。
今回は大きめのテクスチャを10個ロードしたので、この中からこれを特定してみます。
まずNewグループを開いて、ウィンドウの横幅を広げます。

f:id:halya_11:20190526021215p:plain

次にNative Sizeを降順に設定します。

f:id:halya_11:20190526021423p:plain

するとロードした10個のテクスチャが上のほうに表示されました。

f:id:halya_11:20190526021538p:plain

このようなフローでDiffを分析していくと、メモリリークの特定などに役立ちそうです。

参考

docs.unity3d.com