Unity中銷燬遊戲對象的方式

銷燬方式

銷燬物體的方式有兩種:Destroy和DestroyImmediate兩種,那二者有什麼區別呢?細聽分說。異步

兩種方式都能達到銷燬物體的目的,有如下區別:spa

Destroy銷燬場景中的物體可是內存還存在,或一段時間沒有再次被使用,纔會銷燬而且釋放內存,這樣避免了頻繁對內存的讀寫操做,系統回收器會定時清理內存中沒有被引用的對象,極可能有些地方你依然引用了該對象在你本身都不知道的地方,或者你忽略的地方,直接銷燬會致使引用地方出現空引用的引用錯誤。線程

DestroyImmediate則是當即銷燬對象,並從內存中移除掉。code

例子

好比說你要銷燬某一物體下的10個子物體,假設是要銷燬A物體下的a0--a9,10個子物體orm

 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個。blog

但若是是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是異步銷燬,通常在下一幀就會銷燬,不會影響主線程的進行。io

歡迎指正。

相關文章
相關標籤/搜索