你應該知道的AssetBundle管理機制

2021-08-15 03:10:12 字數 1889 閱讀 8859

接上期assetbundle打包的講解,我們今天為大家繼續探秘assetbundle,從管理機制的角度出發,談談其資源載入和解除安裝的原理。

通過assetbundle載入資源,分為兩步,第一步是獲取assetbundle物件,第二步是通過該物件載入需要的資源。而第一步又分為兩種方式,下文中將結合常用的api進行詳細地描述。

(1)先獲取www物件,再通過www.assetbundle獲取assetbundle物件:

(2) 直接獲取assetbundle:

(1)前者的優勢

(2)前者的劣勢

在管理assetbundle時,了解其載入過程中對記憶體的影響意義重大。在上圖中,我們在中間列出了assetbundle載入資源後,記憶體中各類物件的分布圖,在左側則列出了每一類記憶體的產生所涉及到的載入api:

ios系統有256個開啟檔案的上限,因此,記憶體中通過createfromfile或www.loadfromcacheordownload載入的assetbundle物件也會低於該值,在較新的版本中,如果loadfromcacheordownload超過上限,則會自動改為new www的形式載入,而較早的版本中則會載入失敗。

對於存在依賴關係的bundle包,在載入時主要注意順序。舉例來說,假設canvasa在bundlea中,所依賴的atlasb在bundleb中,為了確保資源正確引用,那麼最晚建立bundleb的assetbundle物件的時間點是在例項化canvasa之前。即,建立bundlea的assetbundle物件時、load(「canvasa」)時,bundleb的assetbundle物件都可以不在記憶體中。

前文提到了通過assetbundle載入資源時的記憶體分配情況,下面,我們結合常用的api來介紹如何將已分配的記憶體進行解除安裝,最終達到清空所有相關記憶體的目的。

在上圖中的右側,我們列出了各種記憶體物件的解除安裝方式:

在通過assetbundle.unload(false)解除安裝assetbundle物件後,如果重新建立該物件並載入之前載入過的資源到記憶體時,會出現冗餘,即兩份相同的資源。

被指令碼的靜態變數引用的資源,在呼叫resources.unloadunusedassets時,並不會被解除安裝,在profiler中能夠看到其引用情況。

通過以上的講解,相信您對assetbundle的載入和解除安裝已經有了明確的了解。下面,我們將簡單地做一下api選擇上的推薦:

需要說明的是,以上記憶體管理較適合於unity 5.3之前的版本。unity引擎在5.3中對assetbundle的記憶體占用進行一定的調整,目前我們也在進一步的學習和研究中。

你應該知道git rebase

多人開發時,一般都會使用git來進行 管理。使用過git的童鞋肯定對git pullgit pushgit merge非常熟悉。那麼,大家有沒有了解過git rebase命令呢?rebase翻譯成中文叫 變基 相比merge,rebase並沒有進行合併操作,該命令只是提取了當前分支的修改,將其複製在...

你應該知道的 RPC 原理

在校期間大家都寫過不少程式,比如寫個hello world服務類,然後本地呼叫下,如下所示。這些程式的特點是服務消費方和服務提供方是本地呼叫關係。而一旦踏入公司尤其是大型網際網路公司就會發現,公司的系統都由成千上萬大大小小的服務組成,各服務部署在不同的機器上,由不同的團隊負責。這時就會遇到兩個問題 ...

Vertical Align,你應該知道的一切

對哪些元素可以使用vertical align vertical align用於對齊行內元素。所謂行內元素,即display屬性值為下列之一的元素 inline inline block inline table 本文未涉及 其中,行內元素 inline element 就是包含文字的標籤。而行內塊...