前言
最近在編寫基于Addressables的資源管理器,對于資源釋放模塊配合MemoryProfiler進行了測試,下面總結下測試Addressables.Release
的結論。
總結
使用Addressables.Release
釋放資源時,通過MemoryProfiler檢查內存信息發現加載的內容還在內存里面,經過一系列測試加上閱讀文檔和搜索資料后得出以下結論。
1.資源引用計數未清零。
每次通過Addressables加載資源會增加該資源引用計數,使用Addressables.Release
可以減少計數,直到計數清零才會釋放該資源。
2.Addressables.Release是異步操作。
因為我寫的資源管理器是對加載資源進行緩存的,不會重復加載,但是調用Release內存中依然保留了該資源。原因是因為Addressables.Release
是一個異步操作,即使釋放了也不會馬上清除內存,這時如果我們調用Resources.UnloadUnusedAssets()
則會發現該資源的內存被清除。Resources.UnloadUnusedAssets()
是個緩慢的操作,要注意使用時機。
那么如果我們不主動回收的話什么時候自動回收呢?以下列出會自動回收已釋放資源內存的時機。
內存壓力:當系統內存不足時,Unity 會嘗試回收未使用的資源。
場景切換:加載新場景時,Unity 會清理上一個場景中未使用的資源。
低頻率的自動回收:Unity 會定期檢查并回收未使用的資源,但這個過程不是實時的。