天天看點

KEngine:Unity3D資源的打包、加載、調試監控

資源子產品——ResourceModule,是KEngine中最核心的子產品,其他子產品基本或多或少的對它有依賴,它主要的功能是:資源打包、路徑定義、資源管理、資源調試。

資源子產品對Unity的Asset Bundle接口進行了完整的封裝,運作模式下可以使用它進行完整的資源加載、解除安裝,也可以通過它友善地查找資源記憶體洩露的問題。

Unity 5中,Asset Bundle系統做了很大的變化。你隻需将需要打包的資源配置AssetBundle Name,然後執行接口BuildPipeline.BuildAssetBundles(outputPath)就完成了所有AssetBundle的打包,比Unity 4.x友善多了。

KEngine:Unity3D資源的打包、加載、調試監控

圖:把需要打包的資源放到BundleResources目錄中

KEngine:Unity3D資源的打包、加載、調試監控

圖:AssetBundle最終預設生成到Product/Bundles/(Platform)/中

KEngine:Unity3D資源的打包、加載、調試監控

圖:KEngine->AssetBundle->Build All,自動設定BundleResources目錄下所有的資源的Asset Bundle Name并執行打包

在KEngine+Unity 5.x中,把配置AssetBundle Name的這一步也省掉了。你隻需把需要打包的資源,放在Assets/BundleResources目錄中,所有的AssetBundle将會完整導出。

Unity跨平台開發中,針對不同的平台——如編輯器、安卓、IOS、Windows等,一般有不同的資源存放路徑。

像生成的Asset Bundle,還需要針對不同的平台,生成完全不一樣的Asset Bundle資源。

因而KEngine中分别對Unity中的StreamingAssetsPath、PersistentDataPath等做了封裝,開發人員無需為資源放在什麼目錄進行煩惱了(詳見ResourceModule中的InitResourcePath方法),并且,内置了支援熱更新。

假設現在要加載一個UI資源"Login":

<a></a>

這個StaticAssetLoader,做了什麼操作?假設我們在Android平台

獲知ui/login.prefab.bytes這個路徑

尋找熱更新資源,嘗試加載PersistentAssetsPath/Bundles/Android/ui/logins.prefabs.bytes

無法找到熱更新資源,嘗試加載StreamingAssetsPath/Bundles/Android/ui/logins.prefabs.bytes

依然無法找到,加載失敗

KEngine在Unity 5.x中,會自動的先加載依賴資源,你隻要填入Asset Bundle的路徑名字就可以了。就像Unity的Resources類一樣。

使用ResourceModule中的LoadBundle、LoadBundleAsync接口,可以實作類似于Unity的Resources.Load、Resources.LoadAsync的效用。

要注意的是,LoadBundle、LoadBundleAsync接口,起始位址是加載StreamingAssets/Bundles/Win32或StreamingAssets/Bundles/Android這種平台相關的路徑。

KEngine中定義了各種類型的資源加載器,提供更為友善的加載、調試功能,來避免一些使用上的。坑

最常用的Loader有兩個:

StaticAsset:每次調用Load,使用同一份GameObject引用

InstanceAsset:每次調用Load,都會拷貝出一份GameObject

KEngine中的資源釋放,跟Unity的資源釋放明顯差別是:Unity中提供Resources.UnloadUnusedAssets接口,來自動釋放無用的資源的。而KEngine中資源釋放采用純手動的方式。

這主要是因為躺過Unity自動釋放資源的很多坑: 經常會遇到“missing”的資源引用吧?是以選擇了手動釋放機制。

所有XXXLoader,都有一個接口Loader.Release(),舉例:

手工釋放的資源存在引用計數,隻有當引用計數為0,Loader才會觸發回收,并且連同加載過的AssetBundle徹底消滅,節省記憶體。

諸如TextureLoader、AudioLoader等等,所有XXXLoader的使用方法都是一緻的,它們提供CPS回調風格和協程風格

在Unity Editor模式下,所有的XXXLoader加載類執行個體,都會伴随住一個GameObject的産生,而這個GameObject,隻用于進行調試、記憶體資訊檢視:

KEngine:Unity3D資源的打包、加載、調試監控

圖:資源加載調試資訊:Loader、加載的對象

KEngine:Unity3D資源的打包、加載、調試監控

圖:每一個Loader的引用計數資訊,都可以通過面闆來進行實時檢視

如上圖所示,通過KEngine的資源調試器,可以友善的找到加載的AssetBundle的資源對象、監控記憶體占用的大小、Loader加載消耗的時間、Loader目前引用計數等資訊。對比Unity原生的Profiler,這些資訊是即時的。 開發人員可以非常友善的尋找資源洩露問題,優化記憶體占用。

著作權歸作者所有,轉載請聯系作者獲得授權,,并标注“簡書作者”。

<a href="http://www.cnblogs.com/zhaoqingqing/p/5658437.html">KSFramework(內建U3D熱重載)README</a>

<a href="http://www.cnblogs.com/zhaoqingqing/p/5658826.html">KSFramework:Unity3D開發架構快速入門</a>

<a href="http://www.cnblogs.com/zhaoqingqing/p/5659938.html">KEngine策劃指南:配置表格的編輯與編譯</a>

本文轉自趙青青部落格園部落格,原文連結:http://www.cnblogs.com/zhaoqingqing/p/5660197.html,如需轉載請自行聯系原作者

繼續閱讀