ゲーム内で使用してるメモリを把握するのに少しだけ便利なMemory Profilerについてです。
ゲーム内で使用しているメモリ
ゲーム内で使用しているメモリは、ProfilerのMemoryの項目で確認する事が出来ます。ここでは「Assets(使用中のアセット)」「Not Saved(実行時に生成されたアセット)」「Building Resources(エンジン内に含まれるアセット)」「Scene Memory(シーンに含まれるアセット)」といった項目で分別されています。
しかし単純に「細かい事は良いからUnityがメモリ不足で落ちたから、一番重い項目を知りたい」といった場合は多々存在します。
そんな時にMemory Profilerは割と直観的に分かりやすい図として見る事が出来そうです。
導入方法
Memory Profilerのリポジトリにて「ダウンロード」を選択し、最新のリポジトリをダウンロードします。
ファイルを解凍し、Assets/EditorファイルをプロジェクトのAssetsフォルダ以下に配置します。
既にEditorフォルダがある場合、Editor 1と改名されてしまう糞仕様があるので、Editorフォルダへ中身を移動させます。
エラーが無ければ、Memory Profilerのメニューが表示されます。
使い方
使い方は単純です。
Window/Memory Profilerを選択するとメニューが出てくるので、「Snapshot」を選択します。これでProfilerが接続中のゲームのメモリが表示されます。
ここで一つ注意すべきことは、「エディタ上で動作しているゲームに対しプロファイリングを実行すると、エディタのメモリも含まれる」という事です。
例えば上の画像にはLightingDataAssetやAssetDatabaseといったエディタ専用の項目」、エディタを実行する上で使用しているテクスチャ等が含まれています。
また、直前に選択したアセットやInspectorで選択しているアセットも一覧に含まれています。
ゲーム上のメモリを取得する
正しくメモリ消費量を取得するには実際にアプリケーションとして出力して確認する必要があります。しかし、メモリ消費量のために毎回iOSやAndroid向けにビルドするのは辛いものがあります。
そこで自分が良く使ってるのが、exeもしくはappの出力です。とりあえずでもエディタから離してしまえば、エディタのメモリが干渉する事はありません。
流石に実機にリリース状態で出力する物と比較すると誤差がありますが、概ね判断するには十分な内容を得る事が出来ます。
エディタで確認するには、以下のような手順を使用します。
- 出力モードをデバッグモードに設定し、アプリケーションをBuild And Runして起動させる
- Window/Profilerを開き、Active ProfilerをEditroから他の項目(大抵IP)を選択する
→プロファイラでアプリの状態が確認出来る - Memory Profilerを起動し、Take Snapshotをクリック
これで、実際の実機に「近い」内容のメモリが確認出来ます。実際やってみると、GIやRenderTexture、Textureがドン引きするくらいメモリ食ってたりするので、何ともまあ。
アセットの追跡
ProfilerのMemory機能にも同様の機能がありますが、Memory Pforilerにも同様の機能があります。
項目を選択すると、対象の項目が何に使用されているのかを確認する事が出来るみたいです。
追記(テクスチャの中身を知りたい場合)
ちなみに、MemoryProfilerの機能だとテクスチャ名は分かってもテクスチャの内容までは表示してくれません。
ただエディタ専用とはなりますが、内容を確認するプルリクエストがあったので、テクスチャの中身を知りたい(特にAssetBundleからテクスチャをロードしたりして運用する周りで四苦八苦してる人)は採用してみると便利かもしれません。
プルリク通ってたみたいなので、最新版に反映されてると思います。
関連
Unity-Technologies / MemoryProfiler — Bitbucket