銷毀方式
銷毀物體的方式有兩種:Destroy和DestroyImmediate兩種,那兩者有什么區別呢?細聽分說。
兩種方式都能達到銷毀物體的目的,有以下區別:
Destroy銷毀場景中的物體但是內存還存在,或一段時間沒有再次被使用,才會銷毀並且釋放內存,這樣避免了頻繁對內存的讀寫操作,系統回收器會定時清理內存中沒有被引用的對象,很可能有些地方你依然引用了該對象在你自己都不知道的地方,或者你忽略的地方,直接銷毀會導致引用地方出現空引用的引用錯誤。
DestroyImmediate則是立即銷毀對象,並從內存中移除掉。
例子
比如說你要銷毀某一物體下的10個子物體,假設是要銷毀A物體下的a0--a9,10個子物體
1 ///<summary> 2 ///腳本掛在A物體上 3 /// <summary> 4 public class AGameOnject: MonoBehaviour 5 { 6 7 void Start () 8 { 9 for (int i = 0; i < transform.childCount; i++) { 10 Destroy (transform.GetChild (i).gameObject); 11 } 12 } 13 14 }
通過以上代碼就可實現銷毀了A下所有子物體,但是有些人會有疑問,為什么這個地方是GetChild(i),每刪除一個后面的物體不應該向前移嗎?索引會減一的。
所以這就是Destroy的機制,在執行了Destroy后,程序並不能立即檢測到該物體被銷毀了獲取數量是依然是10個。
但如果是DestroyImmediate就不能這樣寫了,如下:
1 public class AGameObject : MonoBehaviour 2 { 3 4 void Start () 5 { 6 int count = transform.childCount; 7 for (int i = 0; i < count; i++) { 8 DestroyImmediate (transform.GetChild (0).gameObject); 9 } 10 11 } 12
13 }
因為DestroyImmediate 一執行就會立即銷毀,並釋放內存,數量就會減一,后面的物體的索引就會向前移動。
總結
DestroyImmediate 一旦銷毀就會立即銷毀,並釋放內存。執行這個操作需要消耗更多時間,影響主線程進行,而Destroy是異步銷毀,一般在下一幀就會銷毀,不會影響主線程的進行。
歡迎指正。