コガネブログ

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

【Unity】Dictionary のキーに列挙型を使用した時のボックス化によるメモリ消費を回避する

はじめに

http://japan.unity3d.com/unite/unite2016/

Unite 2016の「モバイル端末向けのUnityアプリケーションの最適化実践テクニック」
の講演において、Dictionaryのキーに列挙型を使用した場合、
ボックス化が発生してしまい、メモリを余分に消費してしまうとのことでした

ボックス化が発生してしまう例

public enum JobType
{
    SOLDIER , 
    SORCERER, 
    HUNTER  , 
}
var table = new Dictionary<JobType, string>()
{
    { JobType.SOLDIER   , "王国兵士"    }, 
    { JobType.SORCERER  , "魔法使い"    }, 
    { JobType.HUNTER    , "狩人"        }, 
};

Debug.Log( table[ JobType.SOLDIER   ] );
Debug.Log( table[ JobType.SORCERER  ] );
Debug.Log( table[ JobType.HUNTER    ] );

ボックス化を回避する方法

IEqualityComparerを実装するクラスを用意して
Dictionaryのコンストラクタで設定します

public sealed class JobTypeComparer : IEqualityComparer<JobType>
{
    public bool Equals( JobType x, JobType y )
    {
        return x == y;
    }

    public int GetHashCode( JobType obj )
    {
        return ( int )obj;
    }
}
var table = new Dictionary<JobType, string>( new JobTypeComparer() )
{
    { JobType.SOLDIER   , "王国兵士"    }, 
    { JobType.SORCERER  , "魔法使い"    }, 
    { JobType.HUNTER    , "狩人"        }, 
};

Debug.Log( table[ JobType.SOLDIER   ] );
Debug.Log( table[ JobType.SORCERER  ] );
Debug.Log( table[ JobType.HUNTER    ] );

すべての列挙型に対してIEqualityComparerを実装するクラスを手動で用意するのは
とても大変だと思うので、ソースコード自動生成ツールを使用すると良いかなと思います

関連記事