使用Addressable更好的管理內存

你好,我是鄭洪智,你可以叫我大智。我正在帶小新學Unity。

洪流學堂公衆號回覆addr,可以下載Addressable中文手冊,更有視頻教程哦~


小新:“智哥,Assetbundle我只是大概學了一下,但是沒咋用過。你說不用它就會有內存問題?”

大智:“咱們來一起做個測試吧。對於工程裏的資源,一般有三種方式加載實例化:”

  • 場景中的腳本直接在Inspector上引用Prefab
  • 資源放在Resources目錄下,通過Resource.Load加載
  • 使用Assetbundle動態加載

直接引用測試

測試1

首先咱們新建一個工程,先整個空場景,使用Profiler先看一下現在的內存佔用情況。由於在Editor裏面干擾因素比較多,咱們發佈出來測試這個空場景的內存,發佈時選中這個:

在Unity中打開Profiler(Window > Analysis > Profiler, 快捷鍵Ctrl+7),然後打開打包好的程序,程序就會自動連上:

可以看到現在的總內存佔用是:267M,其中貼圖佔了75.3M。

測試2

然後給場景裏面添加一個簡單的腳本,使用public GameObject Prefab;定義一個成員變量。

using UnityEngine;

public class DirectReference : MonoBehaviour
{
    public GameObject ObjPrefab;
}

然後將一個Cube的Prefab拖到這個成員變量上面。Cube上面的材質球帶了一張5.3M文件大小的貼圖。

發佈測試:

以上測試如果在編輯器中測試,會有不準確的地方,但也能看出大概的趨勢。如果想要準確的數值可以打包發佈以後鏈接Proflier測試。

可以看到現在的總內存佔用是:297M,其中貼圖佔了80.6M。

對比就會發現即使Prefab沒有在場景中實例化,依然佔用了內存,這些內存是無法釋放掉的。這還僅僅是一個Prefab,很多時候會用到Prefab數組,內存問題就會更嚴重。

Resources目錄測試

測試3

把場景中的腳本去掉,這樣就沒有直接引用了。把Prefab放到Resources文件夾下,打包測試。

這種情況下你會發現和空場景是一致的,沒有內存問題。但是僅僅是這樣就完了麼?

但是Unity官方是不建議使用Resources目錄的,引用一段原話就是:

Assetbundle/Addressable

Addressable是基於Assetbundle的一個資產管理系統。使用Addressable可以通過弱引用的方式來加載資源,不加載之前是沒有內存消耗的,加載後也可以完全卸載掉,對內存管理十分友好。

總結

使用Addressable已經很簡單了,所以大膽嘗試去使用這個系統吧,會給你帶來很多益處~

洪流學堂公衆號回覆addr,可以下載《Addressable中文手冊》,更有視頻教程哦~

發佈了142 篇原創文章 · 獲贊 77 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章