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 @   三页菌  阅读(1751)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示