销毁方式
销毁物体的方式有两种:Destroy和DestroyImmediate两种,那两者有什么区别呢?细听分说。
两种方式都能达到销毁物体的目的,有以下区别:
Destroy销毁场景中的物体但是内存还存在,或一段时间没有再次被使用,才会销毁并且释放内存,这样避免了频繁对内存的读写操作,系统回收器会定时清理内存中没有被引用的对象,很可能有些地方你依然引用了该对象在你自己都不知道的地方,或者你忽略的地方,直接销毁会导致引用地方出现空引用的引用错误。
DestroyImmediate则是立即销毁对象,并从内存中移除掉。
例子
比如说你要销毁某一物体下的10个子物体,假设是要销毁A物体下的a0--a9,10个子物体
///<summary> ///脚本挂在A物体上 /// <summary> public class AGameOnject: MonoBehaviour { void Start () { for (int i = 0; i < transform.childCount; i++) { Destroy (transform.GetChild (i).gameObject); } } }
通过以上代码就可实现销毁了A下所有子物体,但是有些人会有疑问,为什么这个地方是GetChild(i),每删除一个后面的物体不应该向前移吗?索引会减一的。
所以这就是Destroy的机制,在执行了Destroy后,程序并不能立即检测到该物体被销毁了获取数量是依然是10个。
但如果是DestroyImmediate就不能这样写了,如下:
public class AGameObject : MonoBehaviour { void Start () { int count = transform.childCount; for (int i = 0; i < count; i++) { DestroyImmediate (transform.GetChild (0).gameObject); } } }
因为DestroyImmediate 一执行就会立即销毁,并释放内存,数量就会减一,后面的物体的索引就会向前移动。
总结
DestroyImmediate 一旦销毁就会立即销毁,并释放内存。执行这个操作需要消耗更多时间,影响主线程进行,而Destroy是异步销毁,一般在下一帧就会销毁,不会影响主线程的进行。