天天看點

技術分享連載(三十)資源管理資源管理資源管理開發技巧資源管理

Q1:我想請教一下,下圖這個函數中,每次我都申請了一個List temp = list();在這裡存放6KB的資料,但是如果不做GC處理,這6KB是否就一直累加,直到做GC處理了才會釋放掉,是這樣麼?如果調用次數很多,每次都調用一點點,也會推高記憶體占用嗎?

技術分享連載(三十)資源管理資源管理資源管理開發技巧資源管理

A:是的,這個6KB堆記憶體會随着Update的執行一直配置設定記憶體,所累積的堆記憶體會在GC觸發時進行銷毀。一般來說,研發團隊需要盡可能避免在高頻次調用函數中進行堆記憶體的配置設定。

Q2:我的UWA報告中看到幾乎每次切換場景都會有UIPanel.LateUpdate()這個函數的堆記憶體開銷,請問說明了什麼問題,我是否還能優化?

技術分享連載(三十)資源管理資源管理資源管理開發技巧資源管理
UIPanel.LateUpdate持續配置設定較大量的堆記憶體,說明UI界面在制作上存在以下問題: Panel中Widgets數量過多,且存在頻繁的變動,導緻UIPanel需要進行大量的網格重建; 動靜态UI元素沒有分離。 建議研發團隊對UI界面的制作進行進一步檢測,盡可能将靜态UI元素和動态UI元素分開,存放于不同的Panel下。同時,對于不同頻率的動态元素也建議存放于不同的Panel中。

Q3:我UWA報告中“渲染子產品”界面中看到大部分場景中的三角面片數是正常的,但在某一幀時DrawCall、Traingle、蒙皮網格數驟然提升,請問這可能是什麼原因導緻的?這三個參數的變化曲線是否有規律?為什麼我在切換場景的時候也會有400多的DrawCall呢?

技術分享連載(三十)資源管理資源管理資源管理開發技巧資源管理
從圖中看,這種情況發生在場景切換處。這種情況的發生原因很可能為一次性動态加載大量GameObejct,然後再手動Deactive目前并不需要使用的GameObject。研發團隊可以檢視該峰值處的場景名稱和相關截圖,進而來進一步定位發生該問題的根本原因。

Q4:我移動一個物體從A點到B點,當到達B點後執行另一個事件。我現在是每幀計算物體到B點的距離,當距離小于某個值後算是到達,感覺有點浪費。有沒有什麼推薦的辦法呢?

如果每幀隻進行一次距離上的判斷計算,那麼該耗時開銷本身是很小的。當然,開發團隊可以在B點放置一個Trigger,當A進入Trigger後,通過其回調函數來進行物體的後續操作。

Q5:關于貼圖類型設定請問有什麼好的建議呢?是否所有的貼圖都設定為Advanced比較好?這種情況下的貼圖記憶體是不是比較小?

技術分享連載(三十)資源管理資源管理資源管理開發技巧資源管理
Unity預設情況下會将絕大多數紋理設定為Texture模式。一般來說,Texture模式對于絕大多數紋理資源也都是合适的。上面的例子中,Advanced模式下之是以記憶體占用較小,是因為關閉了Mipmap選項,是以其記憶體下降了。其本質跟Advanced模式無關。Advanced模式較之Texture模式和其他模式,可以更大自由地對紋理資源進行控制。是以,如果你想對紋理資源進行更加自定義地設定,可以選擇Advanced模式進行編輯。

原文出處:侑虎科技

本文作者:admin

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