你好,我是鄭洪智,你可以叫我大智。我正在帶小新學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中文手冊》,更有視頻教程哦~