2013-06-28 15:32
2414人閱讀收藏
舉報目錄(?)
[+]
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學習記錄
揹包系統 ui框架 熱更新遊戲程式設計框架 sbader課程 pbotod server 網路遊戲開發 遊戲程式設計內功 遊戲開發中的設計模式 直接利用socket tcp開發網路遊戲c unity遊戲開發人工智慧程式設計 2 fixedupdate 方法是解決物體抖動的方法,把 放到這個方法就行。...
Unity3D 碰撞測試
碰撞測試這個再遊戲的開發中是很有必要的,當敵人的攻擊的時候,發生碰撞這時候就會造成一定的傷害,因此我們需要根據受到的傷害對使用者的生命值進行控制,因此碰撞的測試是 我們在遊戲的開發過程中需要的一種比較重要的資料。在unity中的碰撞測試有兩種,一種是碰撞,一種是觸發!一種屬於物理碰撞,一種屬於非物理...
unity 3d學習筆記
1.日誌輸出 如果需要觀測webplayer執行時輸出的log,則可以在初始化start中加上下面這樣一段 但是此日誌檔案太大,過於冗餘 playersettings.useplayerlog true 2.場景切換 3.資源載入 所有通過resources類載入的資源必須放在名為resources...