【U3D性能优化教程——代码篇】之三:开发需要掌握的高频函数优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iceSony/article/details/83039100

 

 

本文由@唐三十胖子出品,转载请注明出处。  
文章链接:
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中解决了这个问题

看你自己版本好了

猜你喜欢

转载自blog.csdn.net/iceSony/article/details/83039100