本文由@唐三十胖子出品,转载请注明出处。
文章链接:https://blog.csdn.net/iceSony/article/details/83039100
代码中函数调用无时无刻,那么哪些函数会产生gc呢?
1.自己写的函数中有new对象被频繁调用
2.Unity自带的函数和自己添加的第三方插件中不知道的new对象
接下来的介绍中用自定义函数和第三方函数区分
自定义函数分为:
1.每隔一段时间调用的
2.多个对象中添加并调用的
遵循一个原则:能复用则复用
哪些可以复用:list dictionary 对象组件,放在start函数中,用到就clear()
(注:Vector3本质是struct,只是new语法相似而已)
那还有一些代码中实现了并且要一直new的呢?
方法1:能添加判断就加一个,毕竟if(count>1)不消耗什么性能
方法2:非高频率的添加计时器
方法3:创建一次多次复用(常见实现,对象池)
常见函数替换:
GameObject.CompareTag替换gameObject.tag == “”
Input.GetTouch()和Input.touchCount()来代替Input.touches
Physics.SphereCastNonAlloc()来代替Physics.SphereCastAll()
(后面两种编辑器下会提示弃用的,update中获取GetComponent<T>Editor会警告)
注意:当一个匿名函数中存在外部成员变量,会产生GC
委托会产生GC,不是必要少用
原因:
匿名方法现在要求该方法能够访问方法范围之外的变量状态,因此已成为闭包。
C#生成一个匿名类,用于传递数据(这就是原因)
通常,最好尽可能避免C#中的闭包。应该在性能敏感的代码中最小化匿名方法和方法引用,尤其是在基于每帧执行的代码中。
少用foreach,多用for
unity5.5以前的版本中,在foreach的迭代中都会生成内存垃圾,主要来自于其后的装箱操作。每次在foreach迭代的时候,都会在堆内存上生产一个System.Object用来实现迭代循环操作。在unity5.5中解决了这个问题
看你自己版本好了