天天看點

技術分享連載(三十二)資源管理資源管理資源管理UI 輸入資源管理

Q1:切換場景時,解除安裝上一個場景總感覺耗時,請問大家是否有什麼推薦的方案?

技術分享連載(三十二)資源管理資源管理資源管理UI 輸入資源管理

A:這是Unity在切換場景時調用Resources.UnloadUnusedAssets這個函數造成的,通常情況下其開銷都是會比較大。建議開發團隊通過UWA性能檢測,在加載子產品中進一步定位解除安裝場景的元兇。

技術分享連載(三十二)資源管理資源管理資源管理UI 輸入資源管理

Q2: 我使用Shader.WarmupAllShaders操作,在後續加載資源還是有CreateGPUProgram出現。(Shader都在一個AssetBundle檔案中,都是常駐記憶體的,不會删掉)是必須使用ShaderVariantCollection來加載Shader嗎?

A:以上這種問題的較大可能是:Shader被打包到不同AssetBundle中了,WarmupAllShaders僅能對目前記憶體中的Shader進行warm up。後續如果又有Shader加載進來,則仍然會出現CreateGPUProgram操作。

建議開發團隊使用UWA的資源檢測工具,檢測下AssetBundle中Shader的具體打包情況,檢視是否出現了備援打包的問題。

Q3: iOS上方形POT圖檔有時候會失真,請問這種情況如何避免?一張NPOT的圖變換成POT,是否有推薦的方法? 采用 ToLarger 的模式拉成POT是否會有損失呢?

A:如果可以的話,建議直接将其制作成POT圖檔,而非進行二次轉換。ToLarger确實可以将紋理拉伸成POT紋理,但如果是UI界面(開啟Pixel Perfect)的話,可能顯示時會有較大視覺損失。

Q4: 多人同屏的時候,人物移動會使得頭頂上的名字Mesh重組,進而導緻較為嚴重的卡頓,請問一下是否有優化的辦法?

A: 如果是用UGUI開發的,當頭頂文字數量較多時,确實很容易引起性能問題,可以考慮從以下幾點入手進行優化:

盡可能避免使用UI/Effect,特别是Outline,會使得文本的Mesh增加4倍,導緻UI重建開銷明顯增大;

拆分Canvas,将螢幕中所有的頭頂文字進行分組,放在不同的Canvas下,一方面可以降低更新的頻率(如果分組中沒有文字移動,該組就不會重建),另一方面可以減小重建時涉及到的Mesh大小(重建是以Canvas為機關進行的);

降低移動中的文字的更新頻率,可以考慮在文字移動的距離超過一個門檻值時才真正進行位移,進而可以從機率上降低Canvas更新的頻率。

Q5:AssetBundle在使用時解壓出來的資源會占用一定的記憶體。我們現在想嘗試使用兩種加載方式:(1)在AssetBundle加載相關的資源後,将資源進行緩存,并解除安裝AssetBundle檔案;(2)對AssetBundle檔案進行緩存,以後用到相關資源後再進行直接進行加載。請問這兩種方式你們推薦哪一種比較好?

A:對于Unity 5.3版本之前的項目,建議通過LoadFromCacheOrDownload或LoadFromFile的方式來加載AssetBundle,這樣既可以降低Assetbundle對象的記憶體占用,又可以保持AssetBundle與資源之間的連結關系,進而友善後續具有依賴關系的Prefab的加載。

對于Unity 5.3版本之後的項目,可以從AssetBundle打包本身進行處理。即:使用LZ4格式的AssetBundle檔案,而不使用預設的LZMA格式。同樣可以達到上述的需求,稍有不足的是,LZ4格式的AssetBundle檔案較之LZMA格式的檔案占用稍大。

如果是依賴關系打包,對于被依賴的共享資源AssetBundle檔案,我們還是建議将其緩存在記憶體中,雖有一定的記憶體增加,但可以通過上述辦法極大地降低記憶體上的占用,緩解記憶體壓力。

今天的分享就到這裡。也歡迎熱愛進步的你加入UWA的QQ群(465082844),也許你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。 比起閉門造車,我們更樂意與大家各抒己見,暢所欲言;比起形而上的泛泛而談,我們更樂意與大家直擊痛點,對症下藥。

技術分享連載(三十二)資源管理資源管理資源管理UI 輸入資源管理

你的小目标是什麼呢?今天“UWA”了嗎?

原文出處:侑虎科技

本文作者:admin

轉載請與作者聯系,同時請務必标明文章原始出處和原文連結及本聲明。