轉自:如何優化UI中大量使用SetActive的問題 - UWA Blog (uwa4d.com)
SetActive的開銷主要有幾個方面
1.C#層到Native層的穿梭調用速度比C#層內慢。
2.會導致Canvas拋棄其VBO(頂點緩沖對象)數據。重新啟用Canvas會使Canvas(包括所有的子Canvas)強制進行rebuild和rebatch進程。如果這種情況發生的非常頻繁,增加的CPU使用會造成應用程序的幀率卡頓。
3.UI元素的網格頂點數改變會造成堆內存分配,觸發GC,導致耗時(不過對UI元素進行位置移動不會造成堆內存分配)。
因此優化也可以從以下幾點考慮:
1.在C#層設置變量來標識相應的GO處於Active還是非Active狀態,避免對Active的對象進行SetActive(true),避免對非Active的對象進行SetActive(false)。
對Active進行SetActive(true)時,“底層”會進行判斷,但調用的時候,就已經是從C#層調用底層,導致開銷較高。在C#層判斷好,就避免了讓底層判斷。
2.將要頻繁變化的UI元素與不頻繁變化的UI元素放在不同的Canvas中,減少UI元素變化時的耗時。
3.通過將UI元素的坐標移動到Canvas的范圍之外的方法來顯示與隱藏,避免SetActive的耗時以及SendWillRenderCanvases的耗時。
4.要更改單個UI的顯隱可以通過GetComponent<CanvasRenderer>().SetAlpha(0);來實現,並且勾上CanvasRender.cullTransparentMesh使其不渲染網格,但是這樣做還是會觸發update等函數並且會觸發點擊事件。
5.要更改父物體的顯隱可以通過添加CanvasGroup組件設置透明度的方式來進行顯示與隱藏。