コガネブログ

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

【Unity】指定した範囲内の処理でどのくらい GC Alloc が発生したかログ出力するクラス

ソースコード

using System;
using Unity.Profiling;
using UnityEngine;

public sealed class CheckGCAllocScope : IDisposable
{
#if ENABLE_RELEASE
    public void Dispose()
    {
    }

    public static CheckGCAllocScope Create( string name )
    {
        return default;
    }

#else
    private readonly string m_name;
    private readonly long   m_startValue;

    private static ProfilerRecorder m_profilerRecorder;

    private CheckGCAllocScope( string name )
    {
        m_name       = name;
        m_startValue = m_profilerRecorder.CurrentValue;
    }

    public void Dispose()
    {
        var endValue = m_profilerRecorder.CurrentValue;
        var value    = endValue - m_startValue;

        Debug.Log( $"[GC Alloc] {m_name}: {value}" );
    }

    public static CheckGCAllocScope Create( string name )
    {
        return new(name);
    }

    [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.BeforeSceneLoad )]
    private static void RuntimeInitializeOnLoadMethod()
    {
        m_profilerRecorder.Dispose();
        m_profilerRecorder = ProfilerRecorder.StartNew
        (
            category: ProfilerCategory.Memory,
            statName: "GC Allocated In Frame"
        );
    }

#endif
}

使い方

using System.Collections.Generic;
using UnityEngine;

public class Example : MonoBehaviour
{
    private void Update()
    {
        using ( CheckGCAllocScope.Create( "new List" ) )
        {
            var list = new List<int>();
        }
    }
}

たとえば new List<int>() した時にどれだけ GC Alloc が発生するか確認したい場合は
上記のようなコードを書くことで

f:id:baba_s:20220120145535p:plain

40 B の GC Alloc が発生したことが確認できます

f:id:baba_s:20220120145748p:plain

Profiler を見てみるとログ出力した数値が正しいことが確認できます

注意

f:id:baba_s:20220120145945p:plain

ときどき数値にブレが発生することがあり
常に正確な GC Alloc を検知できるわけではないため
あくまでも参考程度に使用する必要があります