最近在做專案優化的時候發現公司的專案用的還是老式的www去載入assetbundle資源的形式,而且是通過在兩個update裡面分開載入ab和asset的,這樣雖然避免了協程的的使用,但是把一件事分開成了兩件事,而且是需要每一幀都要在update裡面去檢測,這樣會加重update裡面的邏輯負擔,所以我自己就重新用協程去寫了一套資源載入。
---------------------
1 對比www與loadfromfile
首先www是一種以資料流的形式把ab載入到記憶體裡面,他會在初始化的時候去構造網路連線物件,一種類似socket的東西,而且他會在每次初始化的時候去建立www物件,如果不做乙個物件池去管理的話會造成物件過多而出發gc,嚴重的話會導致遊戲卡頓,而且unity官網上也推薦用loadfromfile的形式去載入ab,我去測了下,www與loadfromfile在速度上的差別,loadfromfile可以節省約1/3的時間,所以果斷捨棄掉www。
---------------------
2 使用協程還是使用update去載入
使用update去載入的話相當於是把載入asset與ab分開來,這樣我需要在不同的指令碼去處理這兩件事,會顯得邏輯上很複雜,而且每一幀都要在update檢測,這樣讓邏輯很難被剝離出來。而用協程去實現的話,協程本身會存在一定的開銷,而且協程開啟過多也會造成gc,但是資源載入本身就不應該一次性載入過多的資源,所以協程的數量是可以控制的,那麼協程的開銷也可以忽略不計了,其次是協程把載入asset與ab結合到了一起,變成了一件事,這樣讓邏輯更清晰,我只需要去關心這個協程是如何載入ab與asset就行了,而且也很容易剝離開來。
---------------------
3 assetbundle的依賴以及引用計數
我們都知道在打包出來的ab中會有兩個檔案,乙個是ab包,乙個是manifest檔案,而manifest檔案中就記錄了這個ab包所有的資源的名字等相關資訊,以及ab包所引用的資源,這樣的話我們就可以做乙個工具用來檢測所有ab包中是否存在相同的資源,我們就可以把這些重複的資源單獨出來打成乙個ab包,而執行時載入依賴的話,需要把 buildpipeline.buildassetbundles設定的輸出目錄下的ab中的資源載入出來,轉換為assetbundlemanifest。而ab的引用是會在載入ab的時候用到,主要是為了我們解除安裝資源,因為如果我們在載入完ab包之後沒有做引用計數的話,如果a依賴了b,c也依賴了b,a與c同時載入到場景中,如果沒有做引用計數,解除安裝a的時候會把b也解除安裝掉,那麼c就會出現資源丟失的情況;此外還會出現記憶體洩露的情況,所以我們需要去維護乙個引用計數,來保證正常的解除安裝。
---------------------
4 設計思路
首先我們需要明白我們載入ab包需要寫什麼東西,需要乙個ab名,乙個asset名,乙個**函式,乙個引用計數,乙個依賴陣列,乙個ab的載入狀態,乙個asset載入狀態
---------------------
5 assetbundlemanager
assetbundle不能一次性載入過多,否在會造成非同步載入時被lock,用profiler工具可以看到,所以我設定了乙個佇列每次從佇列中取5個來載入,不同的專案可以根據自己的需要去設定最大載入數量,然後5個載入完了再去檢查佇列中還有request沒,如果有則等這幀完了再載入。在釋放資源的時候提供立即釋放與延遲釋放的選擇。然後剩下是載入場景,因為場景的載入介面是單獨的,但是載入ab部分是一樣的,所以就留給大家自己去完成了
---------------------
原文:
Assetbundle建立與載入
assetbundle建立與載入 unity有兩種動態載入機制 一種是resource.load。一種是assetbundle。assetbundle是unity pro提供的功能,它可以把多個遊戲物件或者資源二進位制檔案封裝到assetbundle中。供載入 解壓使用。建立assetbundle ...
Assetbundle建立與載入
assetbundle建立與載入 unity有兩種動態載入機制 一種是resource.load。一種是assetbundle。assetbundle是unity pro提供的功能,它可以把多個遊戲物件或者資源二進位制檔案封裝到assetbundle中。供載入 解壓使用。建立assetbundle ...
AssetBundle詳解與優化
assetbundle是unity中的一種資源包,這種資源包可以是遊戲內要用到的幾乎所有資源,例如 模型 紋理 預設 場景等大部分檔案更新,並且可以在執行時動態載入。值得注意的是assetbundle是可以多個檔案一起打包,例如將要打包的資源做成預設後再進行打包,這樣可以將預設上面附帶的元件 紋理 ...