博客 / 詳情

返回

為什麼Unity使用AssetBundle熱更的時候要剔除掉.mainfest文件

1)為什麼Unity使用AssetBundle熱更的時候要剔除掉.mainfest文件
​2)Addressable熱更,斷點續傳問題
3)在線性空間,使用後處理解決UI混合問題


這是第341篇UWA技術知識分享的推送,精選了UWA社區的熱門話題,涵蓋了UWA問答、社區帖子等技術知識點,助力大家更全面地掌握和學習。

UWA社區主頁:community.uwa4d.com
UWA QQ羣:465082844

AssetBundle

Q:為什麼Unity使用AssetBundle熱更的時候要剔除掉.mainfest文件?

A:在使用AssetBundle熱更時,Unity會將每個AssetBundle的依賴關係和元數據保存在一個名為文件的文件中。

這個文件描述了AssetBundle的版本、包含哪些資源以及它們之間的依賴關係。

.mainfest文件在構建APK或發佈AssetBundle包時會被打包進去,無法通過熱更方式更新,在進行AssetBundle熱更時,如果不剔除掉文件,則新下載的AssetBundle的文件會覆蓋原來的文件,導致所有已經下載的AssetBundle都需要重新下載,因為它們的依賴關係信息已經丟失。因此,需要在進行AssetBundle熱更時將文件從打包列表中剔除,以避免出現這種情況。

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

Network

Q:利用Addressable進行熱更,採用Disable Catalog Update on StartUp方式,當更新進度沒有完成時殺掉遊戲,再重新啓動遊戲,此時catalogs.Count已經等於0,並不會在此觸發更新,但其實還有部分資源未更新到,這種情況下應該怎麼處理?

1. 首先不能放玩家進入遊戲,因為資源不匹配。
2. 觸發遊戲重新更新,此時catalogs.Count=0,並不會更新資源。

  • 這種情況下是否可以使用Addressables.ClearResourceLocators()和 Caching.ClearCache()清理緩存和已經下載好的資源,再次觸發熱更,這時catalogs.Count 應該是不等於0的吧?

不知道大家都是怎麼處理:資源更新一半殺掉遊戲,重新登錄遊戲?

另外,AddressableAssetSetting->Catalog->Player Version Override這個設置使用的是默認的time stamp還是指定了一個版本號?我這裏指定了一個固定版本,導致catalogs.Count=1,永遠只是更新這次和母包的差異,比如中間已經有幾次熱更了,會把中間幾次的熱更給丟棄。針對這個問題,更新策略是怎麼樣的?

A1:不使用Addressables.UpdateCatalogs(),自己去服務器上下載Catalog文件,如果下載到一半了,取消,不修改版本號。下次進來接着去服務器下載Catalog文件。然後自己下載的Catalog文件可以用Addressables.LoadContentCatalogAsync()加載,然後得到IResourceLocator的所有Key,把所有Key傳入下載列表中進行下載資源文件。

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

A2:進入遊戲第一次Check,之後的那些異步操作都用緩存保存起來即可。

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

A3:第一,你用Disable Catalog Update on StartUp方式啓動,就是默認不更新Catalog,但是在走後面更新的時候,Catalog其實已經更新完了,再調用API更新Catalog自然沒有了。這時只要去GetDownloadSize然後直接更資源就行了。

Catalog的更新和資源更新是兩個階段。最好分開管理。

第二,AA其實只比較資源的Hash,因此沒有版本號概念,所以不存在中間版本,永遠是最新版本和母包。這個PlayerVersionOverride指你打Player的那個版本號,一般是更新母包時才遞增。這種做法可以保證不管玩家手裏是哪份資源,都能更到最新的,並且避免中間的逐版本升級流程。

再有,Keys基本還是需要自己去管理,比如你自己管理了20個Keys,然後調用Addressables.UpdateCatalogs()後告訴你其中5個更新了。那麼如果你立即調用GetDownloadSizeAsync和DownloadDependenciesAsync,可以馬上傳入這5個Key。另外一種情況可能你這一次遊戲中UpdateCatalogs獲得5個更新。但是要到下一次啓動遊戲才調用GetDownloadSizeAsync和DownloadDependenciesAsync,那你可以把這20個Keys都傳進去。

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

UI

Q:線性空間,美術資源是在Gamma空間製作的,參考該方法:
https://blog.csdn.net/euphorias/article/details/125558348

UI效果是對了,但是明顯整個界面變暗了,請問大家是如何解決這個問題的?

根據網上的教程,改了下,多了4個Blit,是否還有性能優化空間?

A1:如果用URP,可以修改URP源碼,場景上使用線性空間,UI使用Gamma空間。<br/>
Git上有對應開源代碼,適用的Unity版本不同,也都有點小bug需要修復:
UI_RenderPipelineInLinearSpace
URP-12-GammaUIAndSplitResolution

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

A2:如果3D相機的Renderer上有後處理,並且能改URP的管線,在UberPost的Frag最後直接做LineraToGamma,可能就不用加Pass。

而且,看起來這個後處理腳本是掛在了UIRenderer上,所以會影響到整體的顏色,可以試試在ForwardRenderer渲染結束後,UI繪製之前,對顏色做一次pow(color, 0.45)也就是LinearToGamma來中和最後的UIRenderer後處理的pow(color, 2.2)。

感謝範世青@UWA問答社區提供了回答

A3:針對“多了4個Blit,是否還有性能優化空間”問題。直接cmd.Blit(_source, _source, _material);就可以了。

感謝題主黃大仙@UWA問答社區提供了回答

封面圖來源於網絡


今天的分享就到這裏。生有涯而知無涯,在漫漫的開發週期中,我們遇到的問題只是冰山一角,UWA社區願伴你同行,一起探索分享。歡迎更多的開發者加入UWA社區。

UWA官網:www.uwa4d.com
UWA社區:community.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ羣:465082844

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.