通過unityEngine命名空間中的接口分配的內存,將會通過unity分配在Native堆: unity的資源;
通過System命名空間中的接口分配的內存,將會通過MonoRuntime分配在Mono堆: unity的C#代碼;
代碼會通過Mono的GC機制自動回收內存垃圾,unity是使用基于Mono的C#作為語言,它是基于Garbage Collection
機制的內存托管語言,但是,即便是內存托管了,也會存在內存泄露,因為GC的算法并不是萬能的;
在unity環境下,Mono堆內存的占用只會增加不會減少;具體來說,可將Mono堆理解為一個內存池,每次Mono堆內存的申請都會在池內進行分配,釋放的時候也是歸還給池,而不會歸還給操作系統。如果某次分配發現池內存不夠了,則會對池進行擴建:向操作系統申請更多的內存來擴大池,以滿足該次的內存分配。需要注意的是,每次對池的擴建都是一次較大的內存分配,每次擴建都會將池擴大6-10M左右
代碼垃圾GC會自動處理,unity資源就需要手動清除了:Resources.UnloadUnusedAssets;該方法只會清除沒用的資源,在調用該方法的時候也會自動調用GC的接口:GC.Collect;而另外一種清除資源的方法:Resources.UnloadAsset不會區分是不是垃圾資源,都會干掉
Resources.UnloadUnusedAssets只是標記,并不清理,并且不是標記為空閑(這個是GC干的,就是mono的清理,因為mono不歸還內存給os,只在mono層標記為空閑,os層還是使用中),只是把該塊內存降級,讓gc清理。所以destroy an object后調Resources.UnloadUnusedAssets并沒有卵用,要等GC來了才生效。
System.GC.Collect() 遵循垃圾回收機制,分層回收 。
.Net不推薦手動在代碼里面調用,因為它會自己在合適的時候調用;調用這句代碼會占用很大的cpu資源,因為它會查找當前項目代碼中所有沒有被引用的資源內存,然后開辟一個新的內存層,再把刪掉后的有引用資源的內存復制到新的內存層。
Resources 加載的資源需要釋放的時候調用 Resources.UnloadUnusedAssets();
WWW 加載資源之后最好調用WWW的Dispose接口,using;