コガネブログ

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

【Unity】【ガベージコレクション】デリゲートを指定する時に関数名ではなくラムダ式を使用することでGCの発生を抑える

検証用スクリプト

using System;

class Program
{
    static void Main()
    {
        int count = 100000000;
        
        //========================================
        // 関数名指定
        //========================================

        for ( int i = 0; i < count; i++ )
        {
            Func( Callback );
        }

        var result1 = GC.CollectionCount( 0 );
        Console.Write( "関数名指定のGC発生回数:" );
        Console.WriteLine( result1 );
        
        //========================================
        // ラムダ式指定
        //========================================
        
        for ( int i = 0; i < count; i++ )
        {
            Func( () => Callback() );
        }
        
        var result2 = GC.CollectionCount( 0 ) - result1;
        Console.Write( "ラムダ式指定のGC発生回数:" );
        Console.WriteLine( result2 );
    }

    private static void Func( Action callback )
    {
    }

    private static void Callback()
    {
    }
}

結果

項目 GC発生回数
関数名指定 762
ラムダ式指定 0

デリゲートを指定する時に関数名ではなくラムダ式を使用することで
GCの発生を抑えて、ゲームのカクツキを回避することができる

参考サイト様