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时需要注意。