Dictionary
当enum作为key的时候产生部分gc alloc,
在使用:
var ret = mDic[Myenum]; // 从下图可以看出产生188Byte的分配
可以想象在逻辑帧中调用次数频繁,产生的垃圾是越来越多.
原因是什么呢?
因为CLR 的Dictionary 在用[]查找key的时候需要用到HashCode,而调用默认的Comparer.GetHashCode(Object o) 以及Equals,此时就会把enum当作值类型boxing.
修改方法:
继承interface,IEqualityComparer 重写GetHashCode以及Equals 避免boxing和unboxing对GC照成压力。
Dictionary 在使用foreach来做loop的时候容易产生GC
从IL可以看出:
几乎每次loop都会取一次itor迭代器,这样是会产生heap分配内存。
修改方式:
这样的话就可以大大减少消耗。
Unity API
当调用mesh中normals的值时,如果这样使用
从Profiler可以看出当访问访问器的normals时候,返回的Vector3[]都是自带API创建在heap上的
所以都会造成不必要的GC。
修改方式:
1.缓存. 2.或者减少此类对象的调用。
类似这样情况的坑还有:
在查找对象时候,最好不要直接 gameObject.tag 来比较str, 转为使用GameObject.CompareTag().
Linq以及匿名函数
因为Linq大多数实现都是已boxing的方式实现,所以在调用频繁的地方,尽量少用.