關於Addressables做啟動熱更資源的路徑問題


1)關於Addressables做啟動熱更資源的路徑問題
​2)Unity 2018 Android平台Blit Type設置為Never時畫面會變暗
3)視頻壓縮方案
4)關於AssetBundle中的資源冗余的問題
5)Addressable如何讓加載的時候不對比服務器


這是第221篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鍾,認真讀完必有收獲。

UWA 問答社區:answer.uwa4d.com
UWA QQ群2:793972859(原群已滿員)

Addressable

Q:關於Addressables做啟動熱更資源的路徑問題,將部分資源在可尋址系統里打入了StreamAssets,並將資源設置Cannot Release。打出程序后修改資源,做熱更流程,然后運行程序也正常檢測熱更並下載,但是下載的更新AssetBundle包並不在PersistentDataPath路徑下。如果是在同一機器下,熱更包會在Unity編輯器的Temp路徑下找到,可是我將程序拿到什么都沒裝的新電腦下,程序還是能檢測熱更下載,但PersistentDataPath仍然看不到熱更AssetBundle,求解。

A1:Addressable下載更新用的是緩存的方式,所以不會在PersistentDataPath里面,會在應用的默認緩存目錄里面,如下圖:


如果需要修改緩存的路徑,這個可以試下:

最后拉進去AddressableAssetSettings的Initialization Object列表里就行。

 

感謝Toushirou@UWA問答社區提供了回答

A2:感謝您的幫助,該方式確實可以重寫緩存路徑。值得注意的是Cache Directory Override並不能完全像Addressables Profiles里路徑一樣配置可變路徑,只支持了帶“{}”的方式,如{UnityEngine.Application.persistentDataPath},帶“[]”則不支持配置。再次感謝層主的幫助!

另外,上層Cache Directory Override最終調用的源碼,可根據自己的需求拓展,如下圖:

 

感謝題主兮風@UWA問答社區提供了回答

A3:在安卓手機上安裝一個apk,並且運行之后,假設這個apk的包名叫com.x.y,會在安卓手機上多3個目錄:
目錄1:sdcard/Android/data/com.x.y,這個目錄下有一個cache目錄。
目錄2:data/app/com.x.y-1,這個目錄下有目錄lib和目錄oat,還有一個base.apk。
目錄3:data/data/com.x.y,這個目錄下有有5個目錄,files,shared_prefs,cache,code_cache,lib。
上面的目錄1的sdcard和目錄2的data是同級的。目錄2和目錄3需要root才能看到,沒有root的手機應該是只能看到sdcard下面的文件。

當我運行Addressable進行遠程加載資源后,在目錄1里面多了一個與cache同級的files目錄,這個files目錄應該就是Application.persistentDataPath。在這個files目錄里面會多兩個目錄,分別是com.unity.addressables,這里面放的是catalog.hash和catalog.json,另外一個是UnityCache目錄,里面有兩個目錄,Shared和Temp,Temp是空的,Shared里面放的是下載的AssetBundle。

Addressable使用的是Caching機制,所以是可以通過類似於Caching.currentCacheForWriting = Caching.AddCache(“D:/Shalou/UnityCaching/”);這樣的操作在PC上更改緩存目錄的,在Android平台上應該也是可以的,這個就和安卓的權限有關系了,沒有做進一步的測試。猜測是,如果沒有開啟External的Write Permission,只能在目錄1下面的files目錄里面進行目錄替換了,也就是只能在Application.persistentDataPath后面添加子目錄來更改緩存目錄。

在PC上,題主說的默認的緩存和persistentDataPath確實是兩個路徑,如下圖:

 

感謝Xuan@UWA問答社區提供了回答


Rendering

Q:有看到說Blit Type設置為Always會多出一次Blit操作,在2018下在真機測試了下出現類似對比度變大,畫面變暗的效果。改回Always就正常。
色彩空間為線性空間。
這項設置有什么講究?

A:AndroidBlitType.Never不提供sRGB后備緩沖區。線性渲染需要一個執行sRGB讀/寫轉換的幀緩沖區(請參閱RenderTexture.sRGB),否則生成的圖像通常顯得太暗。因此,在使用線性渲染時,不建議使用AndroidBlitType.Never。如果想使用AndroidBlitType.Never進行線性渲染,盡管有這些信息,您仍然必須設置自己的sRGB渲染目標並處理針對后備緩沖區的Blit操作。

可以參考一下網址:

https://docs.unity.cn/cn/current/ScriptReference/AndroidBlitType.html
https://docs.unity3d.com/ScriptReference/AndroidBlitType.html

感謝小埃拉@UWA問答社區提供了回答


Video

Q:請教一下,對於視頻來講有什么比較合適的壓縮方案?目前我們原始視頻有近60MB,准備壓縮后放入StreamingAssets下,讀取解壓后播放。除了對VideoClip本身做處理外,還有其他方案么?希望Android和iOS平台都通用。

A1:可以試試壓縮成H.264或者H.265編碼的MP4格式視頻。

感謝馬三小伙兒@UWA問答社區提供了回答

A2:H.264兼容各平台在Unity 2018上。

感謝Eureka@UWA問答社區提供了回答


Assetbundle

Q:用UWA檢測AssetBundle資源冗余時,發現有17個資源冗余,但是通過對比查詢Bundle的Manifest文件,發現這些冗余的資源都會單獨打包成一個AssetBundle,並且沒有存在於自己預設資源中,但是UWA給的結論是這份冗余的資源存在於他所在的各個預設當中,請問是怎么解?

A:我也是當初遇到的問題,Manifest沒有這個冗余,AssetBundle加載進來,內存里你也沒有發現這個冗余,調用GetAllAssetNames也看不到這個冗余的名字,但是如果調用LoadAllAssets,就出現了這個冗余,非常神奇,藏的很隱秘。

原因:Rawimage掛的Texture,ParticleSystem引用UI資源。
冗余的危害我就不說了。

解決方案:如果說盡量保證Rawimage的圖和Prefab等資源打到一個AssetBundle,這個有點難,也很累,排查起來比較困難。

我的解決方案:

  1. 除了Background,禁止Rawimage掛Texture,而說實話,我的Background都做了RGBA分離,所以Rawimage掛的是Material,而Rawiamge不掛Texture是因為我們項目都是異步加載了的,盡量保證Prefab先出來,后面不重要的異步出來。

  2. 禁止粒子特效掛在到UI的Prefab上,並且寫工具,禁止粒子特效的Prefab引用UI資源,由於粒子特效ParticleSystem描述文件缺失大,如果掛在UI上,還會造成Prefab可能上M數量級,影響加載速度,同時粒子特效和UIPrefab分離,也不會造成冗余。

感謝夏霖銳@UWA問答社區提供了回答


Addressable

Q:想做傳統的那種,在進入游戲的時候統一加載更新,而不是目前這種,讀取某個界面,就去服務器判斷。
現在的問題是怎么讓每一次加載的時候不去判斷服務器,而在進入的時候判斷全部更新。

A:可以在游戲啟動的時候在一個專門的更新界面做更新,具體做法是先初始化,然后調用GetDownloadSizeAsync和Addressables.DownloadDependenciesAsync進行AssetBundle更新(Addressable是以AssetBundle為最小更新單元的),這樣就會將所有需要更新的AssetBundle緩存到本地了,下次用到這些資源就不用遠程下載了。大致代碼如下:

    IEnumerator Start() 
    {       

        //只要打包的時候不要將Disable  Catalog Update on Startup勾選上就行,這樣初始化的時候會自動更新Catalog到最新
        yield return Addressables.InitializeAsync();

        IEnumerable<IResourceLocator> locators = Addressables.ResourceLocators;        
        List<object> keys = new List<object>();
        //暴力遍歷所有的key
        foreach (var locator in locators)
        {            
            foreach(var key in locator.Keys)
            {
                keys.Add(key);
            }
        }

        var handle = Addressables.GetDownloadSizeAsync(keys);
        yield return handle;
        long downloadSize = handle.Result;

        if (downloadSize > 0)
        {
            yield return Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union, true);                
        }        
    }

 

在游戲過程中,Addressable初始化以后,只要不調用Addressables.CheckForCatalogUpdates和Addressables.UpdateCatalogs,內存中常駐的Catalog生成的映射表對象是不會發生改變的,就算把服務器的Catalog和資源更新了也不會影響客戶端的運行。

感謝Xuan@UWA問答社區提供了回答

 

封面圖來源於網絡


今天的分享就到這里。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上准備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ群:793972859(原群已滿員)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM