Unity避免SetActive的使用(轉)


轉自:如何優化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組件設置透明度的方式來進行顯示與隱藏。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM