天天看點

技術分享連載(二十二)資源管理資源管理圖形渲染資源管理資源管理

Q1:StaticBatchingUtility.Combine會産生Combined Mesh的記憶體,如何手動删除這部分記憶體?

在需要删除時,首先可以通過某個使用了該Combined Mesh的MeshFilter來擷取其引用(MeshFilter.sharedMesh),然後通過Destroy接口來将其解除安裝。因為Combined Mesh不屬于真正的Assets(在Deep Memory中不屬于Assets下,而是在Scene Memory下),是以不能用Resources.UnloadAsset來解除安裝。

Q2:Unity 5.x 能把指定集合的Mesh烘焙到一張Lightmap裡嗎?

Unity 5.x 是沒有這樣的功能項的。據我們的判斷,這樣的需求通常是為了動态加載,是以可以嘗試将Mesh分組到不同的場景分别烘焙。而在加載時可通過腳本動态地合并Lightmap,同時将物件的Lightmap Index進行正确的偏移即可。

Q3:我們現在采取了2種資源管理方式, 我想了解下記憶體占用問題。 方式A:AssetBundle加載好以後在記憶體中保留, 如果需要建立對象就通過Instantiate來建立。方式B:AssetBundle加載好以後立刻通過Instantiate執行個體化一個對象, 然後Unload(false)這個AssetBundle,如果需要,建立對象通過clone來完成。對于方式A,在Profiler中發現 WebStream中有相關AssetBundle檔案存在, 我們認為這份記憶體是多餘的, 是以就采取了方式B, 方式B又面臨資源解除安裝不幹淨的情況。想确認一個問題, 如果采取方式A: 一個 xxx.assetBundle原始檔案大小是 1MB, 解壓到Webstream記憶體中是2MB, 最終實際記憶體占用是2MB 還是3MB 呢?

如果采取方式A:最終實際記憶體占用是2MB,而不是3MB,WebStream中已經包含原始AssetBundle的資料。對于沒有依賴關系的AssetBundle檔案,我們推薦方式B的形式對AssetBundle進行解除安裝,這樣可以免除不必要的記憶體占用,對于這種方式加載出來的資源,可以通過Resources.UnloadAsset和Resources.UnloadUnusedAssets來進行解除安裝,如果無法解除安裝,則該資源一定被緩存了,研發團隊可通過檢測自己的緩存池/Constainer來進行檢測。同時,如果是Unity 5.3以後版本,可嘗試通過Memory Profiler來進一步檢視。

Q4:請問一下,我兩個預設都引用了第三個AssetBundle的貼圖,如果不希望這張貼圖存在兩份,一定要等這兩個預設都加載好了,才能解除安裝貼圖的AssetBundle嗎 ?

是的,但并不是因為這樣做會使“這張貼圖存在兩份”,而是因為如果先解除安裝貼圖的AssetBundle會導緻後續加載兩個預設時會丢失依賴,即找不到貼圖。如果腳本中會對這個情況進行檢查并重新加載貼圖的AssetBundle,那麼此時才會造成“這張貼圖存在兩份”的問題。

Q5: 關于Loading.ReadObject耗費比較高,有什麼推薦的方法嗎?

Loading.ReadObject是Unity引擎的資源加載函數,一般出現在切換場景和加載API調用時,這其中包括紋理、網格、Material、Shader、AnimationClip等資源。如果你發現該值過高,建議去大力優化加載的相關資源。對于每種資源的加載,我們正在以專題的方式進行總結和分享,建議大家可以先檢視以下内容: 加載子產品之紋理 加載子產品之網格 加載子產品之Shader 其他子產品歡迎大家關注我們日後的文章推送。

原文出處:侑虎科技

轉載請與作者聯系,同時請務必标明文章原始出處和原文連結及本聲明。

繼續閱讀