UnityAssetBundle如何實現(xiàn)分割與合并

這篇文章主要介紹了Unity AssetBundle如何實現(xiàn)分割與合并,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

黃州網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),黃州網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為黃州1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的黃州做網(wǎng)站的公司定做!

介紹

Unity AssetBundle 中的資源非常容易被提取,如果想要阻止簡單的提取行為,可以嘗試在打包時將文件分割,在運行時將文件合并。

打包

打包時將文件分割成多個文件,這個可以根據(jù)需要指定規(guī)則處理。例如可以使用隨機文件名、分割成隨機的份數(shù)。

加載

LoadFromStream

Unity 2017.4 Unity 2018.4 Unity 2019.3 Unity 2020.1 或更高版本新增了一個從流讀取 AssetBundle 的 API,那么可以將多個文件合并為一個文件流供 API 使用。

  • Unity - Scripting API: AssetBundle.LoadFromStream

雖然通過這個 API 可以自定義 AssetBundle 加載方式,包括加密、多文件讀取、內(nèi)存中讀取等等。但是有一個致命缺點:使用時占用文件打開數(shù)量,而操作系統(tǒng)對文件打開數(shù)量是有上限的。

5.5.4. iOS file handle overuse
Current versions of Unity are not affected by this issue.
In versions prior to Unity 5.3.2p2, Unity would hold an open file handle to an AssetBundle the entire time that the AssetBundle is loaded. This is not a problem on most platforms. However, iOS limits the number of file handles a process may simultaneously have open to 255. If loading an AssetBundle causes this limit to be exceeded, the loading call will fail with a “Too Many Open File Handles” error.
This was a common problem for projects trying to divide their content across many hundreds or thousands of AssetBundles.

  • Assets, Resources and AssetBundles - Unity Learn

具體需要在真機測試,可以嘗試在 Update 中一直打開文件,然后看界面顯示的打開文件數(shù)量,到達某一數(shù)字后進程會被強制結(jié)束。

using System.Collections.Generic;using System.IO;using UnityEngine;
public class Test : MonoBehaviour{    List<FileStream> _openFileStreams = new List<FileStream>();
   void OnGUI()    {        GUILayout.Label(_openFileStreams.Count.ToString());    }
   void Update()    {        _openFileStreams.Add(File.Create(_openFileStreams.Count.ToString()));    }}

Android上用LoadFromStreamAsync加載報Too many open files – UWA問答:幫助開發(fā)者找到更好的答案

以下鏈接中提供了一個可用的 MultiStream 實現(xiàn),建議參考使用。經(jīng)測試可以在 Unity 2018.4.12f1 中正確加載 AssetBundle 并讀取其中資源進行實例化顯示到場景中。

  • Combine Multiple Streams in a Single .NET Framework Stream Object

建議:由于受文件打開數(shù)量上限影響,可以考慮只為關(guān)鍵資源使用 MultiStream 方式加載。

LoadFromFile

如果使用 LoadFromFile API,那么需要提前對文件進行合并,這一步驟可以放在首次啟動時處理。

對文件進行合并的操作可以放在后臺線程中處理,另外可以將文件劃分優(yōu)先級,只有馬上要用的文件優(yōu)先處理,處理完成后進入游戲;剩下的文件在后臺繼續(xù)處理。

驗證

在合并文件時可以使用大小及 MD5 驗證。

MD5 驗證看起來不錯,但是在 Unity 5.6.6f2 + Xcode 11 環(huán)境下測試時發(fā)現(xiàn) Debug 版本耗時超長,Release 版本中不受影響。

實際結(jié)果是 1800+ 文件共計 180+MB 在 Debug 下需要 150 多秒驗證,懷疑 MD5 代碼中存在數(shù)據(jù)競爭問題。

考慮到 MD5 驗證意義不大,因為打包時可以保證文件都是正確的,因此這步可以跳過,只做大小驗證。

測試

可以使用 Instruments 工具對耗時進行測試,通過工具可以輕易地看到耗時過長的調(diào)用。

大概的使用方法可以參考 Unity 文章:

  • Optimizing Shader Info Loading, or Look at Yer Data! - Unity Technologies Blog

優(yōu)化

在合并文件時,要注意盡可能地減少無用操作,例如:

  • 合并的緩存 Buffer 可以在外部預(yù)先創(chuàng)建好,然后傳遞給合并方法使用,減少 GC 次數(shù)與時間。

  • 增大緩存 Buffer 大小,減少系統(tǒng)調(diào)用次數(shù)。

  • 減少 IO 操作,包括不限于檢查目錄是否存在、創(chuàng)建目錄、創(chuàng)建文件等等。

  • 使用線程時需要指定線程的優(yōu)先級為最高,可以為線程多增加一些時間片使用。

  • 使用 StopWatch 處理時,注意 StopWatch 提供的是墻上時間,而不是 CPU 時間,不要被誤導(dǎo)。

  • 減少拆分文件的數(shù)量,文件數(shù)量的多少直接影響 IO 操作的數(shù)量。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Unity AssetBundle如何實現(xiàn)分割與合并”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

分享文章:UnityAssetBundle如何實現(xiàn)分割與合并
網(wǎng)站鏈接:http://bm7419.com/article12/gijegc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站策劃、動態(tài)網(wǎng)站、做網(wǎng)站、關(guān)鍵詞優(yōu)化、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計