C# Lambda 和 匿名函数的GC总结

若是一个匿名函数引用到外部变量,则会造成一个闭包,C#为了实现这一点会生成一个匿名类(记住,类都是引用类型)来保存用到的外部变量,因此当调用这个闭包时,首先会实例化一个副本,同时会采用外部变量实际值来初始化这个副本,最终致使会在堆上分配内存。也就是说闭包就一定会产生内存分配

很有可能我们这个LINQ会在排序函数中用到,那么产生的GC就不是一个小数目了。

游戏的卡顿也会跟随着出现。

测试代码:

                List list = new List();
                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 产生了

 
所以在unity中,不要在类似update或者循环中频繁,使用产生GC Linq语句。

你可能感兴趣的:(unity,优化,c#,linq,开发语言)