天天看點

技術分享連載(三十三)資源管理資源管理資源管理性能優化性能優化

Q1:在Unity 5.x版本下,我們在用UGUI的過程中發現它把圖集都打進了包裡,這樣就不能自動更新了,請問圖集怎麼做自動更新呢?

在Unity 5.x中UGUI使用的Atlas确實是不可見的,是以無法直接将其獨立打包。但我們建議,可以把Packing Tag相同的源紋理檔案,打到同一個AssetBundle中(設定一樣的AssetBundle Name),進而避免Atlas的備援。同時這樣打包可以讓依賴它的Canvas的打包更加自由,即不需要把依賴它的Canvas都打在一個AssetBundle中,在更新時直接更新Atlas所在的AssetBundle即可。

Q2:圖中的Material.SetPassFast占用很高,這是我在第一次執行個體化一個特效,但是第二次執行個體化就不會出現高值了,請問能怎麼優化嗎?

技術分享連載(三十三)資源管理資源管理資源管理性能優化性能優化
該過程是在處理Shader,Unity 5.3以後在第一次顯示時才會将Shader進行Warmup,是以就會造成一次峰值卡頓。研發團隊可以參考我們之前的分享:Unity加載子產品深度解析之Shader篇以加深了解。

Q3: UWA建議“盡可能将靜态UI元素和頻繁變化的動态UI元素分開,存放于不同的Panel下。同時,對于不同頻率的動态元素也建議存放于不同的Panel中。”那麼請問,如果把特效放在Panel裡面,需要把特效拆到動态的裡面嗎?

通常特效是指粒子系統,而粒子系統的渲染和UI是獨立的,僅能通過Render Order來改變兩者的渲染順序,而粒子系統的變化并不會引起UI部分的重建,是以特效的放置并沒有特殊的要求。

Q4:Draw Call和Setpass Call,這兩個名額主要是看哪一個?關于這點衆說紛纭,很多地方都是說看SetPass Call,但是在UWA的性能測試中,還是把Draw Call當成唯一名額。

技術分享連載(三十三)資源管理資源管理資源管理性能優化性能優化
在 Unity 5.x 中,SetPass Call與 Draw Call相比,SetPass Call的名額與性能相關性更大(比如Static Batching的開啟不影響Draw Call數,而SetPass Call通常會明顯下降)。但 SetPass Call在某些情況下也同樣存在問題,比如往一個場景中添加任意個相鄰且材質相同的大網格物體(使Dynamic Batching失效)時,SetPass Call并不會變化。是以在UWA中,我們所使用的是類似Profiler 中 Total Batches 這一項名額,通常該數值與 Frame Debugger 中的數值基本一緻,是以可以通過該工具來檢視每個Batch的内容,進而更有針對性地進行優化。

Q5:我看到UICamera.Update()的GC調用特别高,隻要我一移動就會産生2.8K的GC,看起來是NGUITools.FindInParents這個方法導緻的,有沒有什麼可以優化的方法呢?

技術分享連載(三十三)資源管理資源管理資源管理性能優化性能優化
技術分享連載(三十三)資源管理資源管理資源管理性能優化性能優化
在 Editor 下,當調用GetComponent() 且 T元件并不在目前的GameObject 上時,确實會出現GC Alloc,但這在釋出後是不會出現的,是以建議在真機上做一個驗證。這是因為在Editor下,Unity的MissingComponentException實作所緻,在出現以上情況時,Unity 并不是直接傳回一個 NULL,而是傳回一個代理 Object用來儲存一些相關資訊,在後續被通路時可以給出更詳細的報錯資訊。

原文出處:侑虎科技

本文作者:admin

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