UGUI的开关方案一种是使用SetActive进行的
但是这种方案其实有一个弊端,我们来测试下
每帧进行1000次的SetActive 的true和false
这是我们的UI,上面挂了一些 按钮 图片 输入 等元素
帧率只有2.4,我们看下Profiler
可以看到 GameObject.Activate 和 GameObject.Deactivate 消耗很高,这就是因为大量调用了SetActive
点开查看
可发现其主要原因是SetActive会触发子物体的OnEnable和OnDisable方法,而且这2个方法是有GC的
使得整体带来了GC的消耗
SetActive---------------->OnEnable OnDisable--------------->GC开销
接下来,我们看下CanvasGroup的表现
帧率可维持在60多,GC瞬间没有了,对比强烈
稳定!
SetActive是因为出发unity的MonoBehaviour的生命周期,所以造成GC的消耗
不过注意如果使用了 CanvasGroup 的Alpha来控制界面的显隐,挂载的Monobehaviour脚本是一直执行的,如果你有Update方法的话,这个地方需要自行控制下,SetActive则不需要担心这点