UGUI优化方案之 SetActive 和 CanvasGroup

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则不需要担心这点

 

posted @ 2021-05-08 14:35  三页菌  阅读(1065)  评论(0编辑  收藏  举报