C#中委托相当于类(不是值类型,而是引用类型),
当做为形参传入的时候
或者 System.Action b = TestB;//TestB是一个方法,
这样调用一次为产生112bytes的gcalloc
所以我们要避免在update中这样使用。
同理,我们尽量避免使用LINQ语句,因为Linq语句要求我们传入一个委托(delegate)或者方法名,或者lambda表达式。那么GC就产生。
很有可能我们这个LINQ会在排序函数中用到,那么产生的GC就不是一个小数目了。
游戏的卡顿也会跟随着出现。
测试代码:
List<int> list = new List<int>();
for(int i = 0; i < 100;i++)
{
list.Add(UnityEngine.Random.Range(0, int.MaxValue));
}
int target = 200;
int resultLinq = 0, resultFor = 0;
UnityEngine.Profiling.Profiler.BeginSample("MY_TEST LINQ");
resultLinq = list.Find(i => i == target);
UnityEngine.Profiling.Profiler.EndSample();
UnityEngine.Profiling.Profiler.BeginSample("MY_TEST FOR");
foreach (var i in list)
{
if (i == target)
{
resultFor = i;
}
}
UnityEngine.Profiling.Profiler.EndSample();
Profiler结果:看到 gcalloc 产生了