1. 程式人生 > >Unity中記憶體資源釋放總結

Unity中記憶體資源釋放總結

Unity記憶體釋放 問題主要考慮一下幾個方面:

  • Resources 載入的資源需要釋放的時候呼叫 Resources.UnloadUnusedAssets();

  • WWW 載入資源之後最好呼叫WWW的Dispose介面

  • 建立的RenderTexture必須呼叫Release介面

  • 必須用Xcode聯機除錯確定C++層有沒有記憶體洩漏

  • AssetBundle資源在Unity Profile中的Scene Memory不會顯示,可以通過Xcode聯機除錯確定有沒有釋放完全

  • 載入資源和解除安裝資源的非同步處理,避免同一幀內載入過多資源導致記憶體瞬間增大從而導致Crash(低配機器上表現更明顯)

一般通過WWW載入一張Texture來通過Image顯示的話,有一個方法是使用Texture通過Sprite.Create來建立一個Sprite物件賦值給Image.overrideSprite完成顯示。但是需要注意一個問題,Sprite.Create建立物件對拷貝Texture中資料,並生成一個新的Sprite物件,這樣會造成耗費最少2倍(如果要獲取MipMap則會更大)Texture大小的記憶體,而且這個記憶體佔用不會隨著Image的銷燬而馬上銷燬,直到呼叫Resources.UnloadUnusedResources()才會銷燬。如果在一個場景中有大量的圖片需要動態載入的話,那麼必須注意記憶體問題了。所以建議不要使用顯示Image的方式,有一種方式是顯示RawImage,按照官方文件的描述:

The Raw Image control displays a non-interactive image to the user. This can be used for decoration, icons, etc, and the image can also be changed from a script to reflect changes in other controls.

RawImage是一個沒有和使用者互動的Image,所以如果我們不需要比如事件這種互動的操作的話,還是建議用RawImage來顯示Texture。RawImage的方式會高效很多,如果從AssetBundle裡面載入了一張Texture,不管是賦值給多少個RawImage,Texture是公用的,只會有一份記憶體。