Unity3d資源管理分析

2021-07-05 04:26:03 字數 1996 閱讀 3783

1.unity3d占用記憶體太大的解決方法 - 星塵

討論assetbundle-resources-gameobject 的生命週期問題。對assetbundle.unload,instantiate,destory,unloadunusedasset有詳細的辨析。

討論基於unity3d 4.1.5,不定時更新。

美術資源應匯出為assetbundle檔案。這種assetbundle有兩種儲存方式:可以是未壓縮的,也可以使用7z演算法壓縮,預設壓縮。以我手頭的乙個蒙皮動畫角色為例,壓縮後檔案大小由800k減少到260k。匯出過程中各個成分佔的檔案比例會在logs中列印出來,以供分析和優化。

assetbundle有下面兩個主要的載入方法:

載入過程中會產生**中間產物:

assetbundle

asset-object:所有assetbundle.load*建立的object,包括mainasset

cloned-object:instantiate乙個asset-object之後產生的object

其中,assetbundle是資源的靜態二進位制存檔形式。此時資源並沒有真正讀出,只有執行load操作資源才會被建立到resouces系統中。resources系統管理asset-object亦即實際的資源,包括貼圖、mesh、asset-gameobject。其中的asset-gameobject非常類似cloned-gameobject,但是無法掛載到場景中,無法被destroy銷毀,只能用instantiate生成cloned-object。實際我們看見的是cloned-object。

unity3d並沒有追蹤每個資源的**。假如你反覆載入同乙個資源檔案,每次assetbundle.createfromfile/memory都會建立乙個新的assetbundle,包含新的貼圖、新的模型。為了減少這類誤用,unity在每個資源包的二進位制內容中新增了乙個隨機包標誌(包標誌是匯出時新增的,即使是同乙個資源,每次匯出都是不同的包)。unity3d通過比較包標誌的方式,禁止同時存在兩個讀取了相同資源包。若乙個資源包對應的assetbundle沒有unload,再次建立新的該資源的assetbundle時會丟擲錯誤:

但是unity只是簡單在assetbundle建立時做了檢查,在asset-object級沒有記錄包標誌**,也不會合併相同資源。

總的來說,專案框架需要手工管理assetbundle,保證同一套資源不重複載入。

所有assetbundle.load*載入的unityengine.object,我們稱為asset-object,與instantiate創造出的 cloned-object相對應。

這兩個概念在[1]的第一張配圖中分別標記為」asset-*「和」*-複製「。對成員mainasset的訪問實際上是完整的載入函式呼叫,為手工呼叫load的簡化版。另外經測試,反覆load同乙個資源至少沒有額外資源洩露。

在unity自帶的profile系統中,memory欄下 textures/meshes/materials/animationclips/audioclips指的就是asset-object。例如,從乙個史萊姆instantiate出很多史萊姆並不會增加textures或者meshes計數。

雖然都是unityengine.object,但是asset-object和cloned-object本質是不同的。例如,如果對asset-object執行destroy,系統會報錯:

asset-object是由resources系統管理的,包括asset中的texture、animationclips等,為記憶體開銷的主要**。resources系統使用弱引用管理asset-object,同時提供了resources.unloadunusedasset()以刪除沒有不再被強引用的asset-object。注意他檢查的是所有強引用,並不限於場景中實際gameobject,所以如果你的**中記錄了的asset表,還有某些**的意外引用都會阻止這些資源被resources系統釋放。

裡面提到c#進行本地配置的問題,看不大懂先掛著,有時間再去研究

Unity3D的資源管理

asset bundles 製作 buildpipeline.buildassetbundle 載入 assetbundle.load 解除安裝 assetbundle.unload bool unloadallloadedobjects unloadallloadedobjects true 釋放...

Unity3D 美術資源規範

一.單位,比例統一 在建模型前先設定好單位,在同一場景中會用到的模型的單位設定必須一樣,模型與模型之間的比例要正確,和程式的匯入單位一致,即便到程式需要縮放也可以統一調整縮放比例。統一單位為公尺。二.模型規範 所有角色模型最好站立在原點。沒有特定要求下,必須以物體物件中心為軸心。面數的控制。移動裝置...

Unity3D 動態載入資源

一 內部呼叫 1.resources.load path type 或resources.loadall path type 載入儲存在resources資料夾中path處的資源,必須忽略字尾名。gameobject instance instantiate resources.load enemy...