转自:如何优化UI中大量使用SetActive的问题 - UWA Blog (uwa4d.com)
SetActive的开销主要有几个方面
1.C#层到Native层的穿梭调用速度比C#层内慢。
2.UI元素的变化导致所在的Canvas变化,触发函数Canvas.SendWillRenderCanvases()与Canvas.BuildBatch()造成高耗时。
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.经测试,对Component进行enabled = false的操作比对GO进行SetActive(false)的操作耗时低。
5.通过添加CanvasGroup组件设置透明度的方式来进行显示与隐藏。