コガネブログ

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

【Unity】Debug.Log でスタックトレースを非表示にした時の GC Alloc と処理時間の検証

はじめに

f:id:baba_s:20200908111707p:plain

  • Unity では Debug.Log する時にスタックトレースの情報も出力するかどうか設定できる
    • エディタの Project Settings > Player > Other Settings から設定可能
    • エディタ拡張のスクリプトから PlayerSettings.SetStackTraceLogType で設定可能
    • ランタイムのスクリプトから Application.SetStackTraceLogType で設定可能
  • Debug.Log でスタックトレースを表示するかどうかでどのくらい
    GC Alloc や処理時間が変わるか1フレームに1万回 Debug.Log して検証

検証用スクリプト

using UnityEngine;
using UnityEngine.Profiling;

public class Example : MonoBehaviour
{
    public int m_count = 10000;

    private void Update()
    {
        if ( Input.GetKeyDown( KeyCode.Space ) )
        {
            {
                Application.SetStackTraceLogType
                ( 
                    LogType.Log, 
                    StackTraceLogType.ScriptOnly 
                );

                var sampler = CustomSampler.Create( "# スタックトレースあり" );
                sampler.Begin();

                for ( int i = 0; i < m_count; i++ )
                {
                    Debug.Log( "ピカチュウ" );
                }

                sampler.End();
            }
            
            {
                Application.SetStackTraceLogType
                ( 
                    LogType.Log, 
                    StackTraceLogType.None 
                );

                var sampler = CustomSampler.Create( "# スタックトレースなし" );
                sampler.Begin();

                for ( int i = 0; i < m_count; i++ )
                {
                    Debug.Log( "ピカチュウ" );
                }

                sampler.End();
            }
        }
    }
}

検証結果

f:id:baba_s:20200908112502p:plain

項目 GC Alloc 処理時間
スタックトレースあり 40.1 MB 1.14 秒
スタックトレースなし 0.7 MB 0.14 秒