1. SetActive()方法

用于激活和禁用GamObject。

使用SetActive控制游戏对象显隐会触发游戏对象(包括子对象)的OnEnble 或OnDisable方法,这两个方法会带来GC的消耗。并且对应的Monobehaviour脚本会停止运行。同时会导致Canvas画布Rebuild。

SetActive(true),会触发MonoBehaviour.OnEnable()事件,如果对象之前本就是activeSelf==true,事件不会发生; SetActive(false),会触发MonoBehaviour.OnDisable()事件,如果对象之前本就是activeSelf==false,事件不会发生;

  • 性能开销:

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

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

  • 内存分配和GC

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

2. enable属性

用于激活和禁用Component。

适用图形组件 (如 文本组件和图片组件)的显隐设置,但是会触发对应的OnEnble 或OnDisable方法,产生GC消耗。

3.CanvasGroup.Alpha属性

使用CanvasGroup.alpha控制游戏对象显隐则没有GC的消耗,并不会触发对应的OnEnble 或OnDisable方法。但是对应的Monobehaviour会继续运行,对于脚本中有Updade或FixedUpdate时需要注意。

4.设置游戏对象缩放

设置游戏对象的Scale,可以达到显隐效果,并不会触发对应的OnEnble 或OnDisable方法。但是对应Monobehaviour仍会运行,对于脚本中有Updade或FixedUpdate时需要注意。