因为SetActive()会遍历这个实体上所有继承MonoBehavior的脚本,并调用OnEnable()和OnDisable()方法,产生大量GC。 例如: Image组件继承于MaskableGraphic,其中MaskableGraphic的OnEnable()和OnDisable()有大量计算,会产生GC。 如果被SetActive()的实体上组件越多,带来的消耗就越高。
不调用SetActive
需禁用组件
RectMask2D
ScrollRect
UIScaleButton // 在Update做任意操作的类
慎用自带组件Outline和Shaow,都是通过重复绘制多个Mesh实现的,其中Showdow绘制为原文本Mesh的2倍,而Outline为5倍,对渲染面数、顶点数,BuildBatch和SendWillRenderCanvases的耗时,Overdraw都有影响。若对于某种字体每次出现都需要这两种效果,可以让美术同学直接把阴影和描边做到字体里。
对于血条、飘字、小地图标记等频繁更新位置的UI,可尽量减低更新频率,如隔帧更新,并设定更新阈值,当位移大于一定数值时再赋值(一方面是位移小时可能表现上看不出位移,另一方面是就算是没有实际位移,重复赋相同的值,也会SetDirty触发重建),可减少BuildBatch耗时。
Profiler.BeginSample("My Sample");
Profiler.EndSample();
private CullStateChangedEvent m_OnCullStateChanged = new CullStateChangedEvent();
特效不会隐藏,其余把界面移到屏幕外效果一样 把界面移到屏幕外若在同一帧执行隐藏 加载的图集可能渲染出来是白图
实际上ugui底层的设计比你这些方案要快不少(尤其是dynamic batch),就是unity自己的多线性设计上有问题More