ソースコード
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 が発生するか確認したい場合は
上記のようなコードを書くことで
40 B の GC Alloc が発生したことが確認できます
Profiler を見てみるとログ出力した数値が正しいことが確認できます
注意
ときどき数値にブレが発生することがあり
常に正確な GC Alloc を検知できるわけではないため
あくまでも参考程度に使用する必要があります