参考链接:
https://www.cnblogs.com/zblade/p/6445578.html
http://www.manew.com/thread-101174-1-1.html
gc是代码层面上的,分为lua的gc和c#的gc
lua:注意table的使用,例如为了减少lua和c#的交互,会在lua层上用table来实现Vector3,这时如果在update中进行Vector3运算就会大量地分配Vector3
c#:注意装箱操作,还有方法的返回,例如如果方法返回的是一个数组,那么说明执行这个方法时会分配内存产生一个新的数组,从而产生gc
以下都是测试过的:
1.GameObject.name和GameObject.tag会产生gc,替代方案为GameObject.CompareTag
2.Input.touches会产生gc,替代方案为Input.touchCount配合Input.GetTouch
3.Physics.SphereCastAll会产生gc,替代方案为Physics.SphereCastNonAlloc
从2和3可以看出,如果方法返回的是一个数组,那么说明执行这个方法时会分配内存产生一个新的数组,从而产生gc
4.装箱操作(值类型转化为引用类型)会产生gc,典型的例子为Debug.Log,其方法签名是public static void Log(object message);
5.StartCoroutine会产生gc
6.yield return 0会产生gc(因为装箱操作),替代方案为yield return null
7.yield return new WaitForSeconds(0.1f)会产生gc(因为new一个对象),替代方案为:
WaitForSeconds waitForSeconds = new WaitForSeconds(0.1f); IEnumerator A() { while (true) { yield return waitForSeconds; } }
8.foreach几乎不会产生gc(unity5.5版本修复了,但第一次执行foreach仍会触发gc)