Unity避免SetActive的使用(转)

转自:如何优化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组件设置透明度的方式来进行显示与隐藏。

原文地址:https://www.cnblogs.com/mcyushao/p/14708979.html