コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】指定した Unity のオブジェクトやアセットのメモリ使用量を取得できる「Profiler.GetRuntimeMemorySizeLong」

概要

f:id:baba_s:20190325225240p:plain

例えば、上記のように3個のテクスチャを描画するシーンを Android にビルドして

using System.Linq;
using System.Text;
using TMPro;
using UnityEngine;
using UnityEngine.Profiling;

public class Example : MonoBehaviour
{
    public TMP_Text m_text;

    private void Start()
    {
        var list = Resources
            .FindObjectsOfTypeAll<Texture2D>()
            .Where( c => ( c.hideFlags & HideFlags.NotEditable ) == 0 )
            .Where( c => ( c.hideFlags & HideFlags.HideAndDontSave ) == 0 )
            .ToArray()
        ;
        var sb = new StringBuilder();
        foreach ( var n in list )
        {
            var memory = Profiler.GetRuntimeMemorySizeLong( n );
            var mb = ( memory >> 10 ) / 1024f;
            sb.AppendLine( $"{n.name}: {mb.ToString( "0.00" )} MB" );
        }
        var text = sb.ToString();
        m_text.text = text;
    }
}

Resources.FindObjectsOfTypeAll で現在読み込まれているすべてのテクスチャを取得し、
Profiler.GetRuntimeMemorySizeLong でそれぞれのテクスチャの
メモリ使用量を取得して画面に描画してみると

f:id:baba_s:20190325225621p:plain

このように、それぞれのテクスチャが 0.37 MB のメモリを使用していることがわかります
(「Emoji One」と「LiberationSans SDF Atlas」は TextMesh Pro が使用している画像)

f:id:baba_s:20190325225746p:plain

Unity エディタの Inspector でテクスチャの容量を見てみると
おおむね一致していることがわかります(0.382 MB)

f:id:baba_s:20190325225851p:plain

Profiler を見てもテクスチャの容量がほぼ同じであることがわかります

このように Profiler.GetRuntimeMemorySizeLong を使用することで
指定した Unity のオブジェクトやアセットのメモリ使用量を取得できます