はじめに
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を実装するクラスを手動で用意するのは
とても大変だと思うので、ソースコード自動生成ツールを使用すると良いかなと思います