Unity中,为什么要避免使用SetActive

原因

  1. 性能开销SetActive方法会导致C#层到Native层的穿梭调用,这比C#层内的速度慢。频繁地调用SetActive可能会导致性能问题,尤其是在大量对象需要被激活或禁用时。

  2. Canvas重建SetActive会导致Canvas抛弃其VBO(顶点缓冲对象)数据,重新启用Canvas会使Canvas(包括所有的子Canvas)强制进行rebuild和rebatch进程。如果这种情况发生的非常频繁,增加的CPU使用会造成应用程序的帧率卡顿。

  3. 触发GC(垃圾回收):UI元素的网格顶点数改变会造成堆内存分配,触发GC,导致耗时。这对UI元素进行位置移动不会造成堆内存分配,但是激活和禁用操作会。

  4. 生命周期事件触发SetActive(true)会触发MonoBehaviour.OnEnable()事件,而SetActive(false)会触发MonoBehaviour.OnDisable()事件,即使对象之前已经是激活或禁用状态。这可能会导致不必要的代码执行,增加开销。

  5. UI性能问题SetActive会触发子物体的OnEnableOnDisable方法,而且这两个方法是有GC的,使得整体带来了GC的消耗。

解决办法

  • 使用变量标识状态:在C#层设置变量来标识相应的GameObject处于Active还是非Active状态,避免对Active的对象进行SetActive(true),避免对非Active的对象进行SetActive(false)

  • 使用CanvasGroup:通过将UI元素的坐标移动到Canvas的范围之外的方法来显示与隐藏,避免SetActive的耗时以及SendWillRenderCanvases的耗时。也可以通过CanvasGroup组件设置透明度的方式来进行显示与隐藏,这样可以避免SetActive引起的负载。

  • 优化Canvas分区:将要频繁变化的UI元素与不频繁变化的UI元素放在不同的Canvas中,减少UI元素变化时的耗时。

  • 使用Scale变换:手游项目中会把频繁需要显示出现的UI的Scale设为0,而不是使用SetActive

通过这些方法,可以减少SetActive的使用,从而优化性能和减少不必要的资源消耗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值