【Unity】Memory Profilerでメモリを使いすぎなオブジェクトを特定する

Memory Profilerでメモリを使いすぎなオブジェクトを特定する方法です。

Unity2018.4.6

はじめに

大規模なゲームを作っているといつの間にかメモリの容量が膨らんでアプリが落ちたりします。
そしてこんなときには意外と不要なオブジェクトがメモリを圧迫していたりします。
この記事ではMemory Profilerを使ってこのようなオブジェクトを特定する手順を紹介します。

なお、Memory Profilerの基本的な使い方は次の記事で説明しています。
本記事はこの知識を前提としていますので必要に応じて参照してください。

light11.hatenadiary.com

準備

まず検証用に無駄に大きいオブジェクトを生成するスクリプトを書いておきます。

using System.Collections.Generic;
using UnityEngine;

public class Example : MonoBehaviour
{
    List<Texture> _textures = new List<Texture>();

    void Start()
    {
        for (int i = 0; i < 10; i++) {
            var tex = new Texture2D(2048, 2048);
            tex.name = "Unused Texure " + i;
            _textures.Add(tex);
        }
    }
}

2048 x 2048のTexture2Dを10個生成しています。
これを適当なGameObjectにアタッチして再生します。

メモリを圧迫しているオブジェクトを特定する手順

それではMemory Profilerを使ってメモリを圧迫しているオブジェクトを特定していきます。

まず任意のタイミングでMemory ProfilerのCapture Playerをクリックしてメモリをキャプチャします。
そしてOpenをクリックしてSnapshotを開きます。

f:id:halya_11:20190823202547p:plain

Texture2Dが大きな割合を占めていることがわかります。

さらに詳細に分析するために、画面下のFiltersと書いてあるウィンドウを広げます。
そしてTypeをクリックしてGroupを選択します。

f:id:halya_11:20190823202758p:plain

次にOwned SizeをクリックしてSort Descendingを選択します。
すると次のようにオブジェクトの型毎に、容量が大きい順に情報がソートされます。

f:id:halya_11:20190823202907p:plain

あとは容量が大きい順におかしいオブジェクトが無いかチェックしていくだけです。
今回はTexture2Dが大きいのでTexture2Dを展開してみます。

f:id:halya_11:20190823203112p:plain

前節で検証用に作ったUnused Textureが上位に表示されていることが確認できました。
エディタでキャプチャするとUnityエディタ用のオブジェクトも表示されたりはするものの、
このような手順でMemory Profilerを使えばメモリを圧迫しているオブジェクトに目星をつけることができます。

ちなみにRefCountには参照カウントが表示され、その数字をクリックすると参照をたどれるのでさらに細かく分析するのに便利です。

関連

light11.hatenadiary.com