前言
在很早之前我做过一次性能分析,分析物体在各种不可视方案下的性能开销但是这个是在对于Gameobject的分析,现在在做ugui的界面显隐的时候,又多出了好几种方案,现在来最这几种方案做一个分析。
正文
测试代码还是和以前一样,对物体进行10万次显隐操作。
隐藏控件
Canvas
在ugui中,界面的渲染都是基于canvas的,所以当我们隐藏掉canvas这个控件的时候,界面也将看不见,所以我们先来做一次canvas的控件显隐操作
因为我的子物体有6个image所以当canvas被隐藏的时候,它会去回调image的渲染回调,所以我们可以看到调用image.OnCanvasHierarchyChanged调用了120万次。回调中因为会用到一些对象,所以它的GC压力很大。
Image
对于单一的物体,我们以Image为例,它的渲染是基于它的Image这个控件,所以当我们把控件隐藏了,它将不再被渲染
这里我们看到它的主要开销是OnEnable和OnDisable这两个方法。
设置透明
CanvasGroup
CanvasGroup是用来控制子控件的alpha等一些界面属性的,所以当我们把它的alpha设置成0的时候,子节点的alpha的值也就变成0了。
看到ugui放出来的CanvasGroup的代码可以看到它有一部分的实现在c++里的,当CanvasGroup的alpha的值发生变化,应该是要发送消息告诉子节点的透明度的变化,所以这里的120万的调用我们猜测是因为子节点有六个,所以要抛消息到所有的子节点上。
image
当image的alpha的值被设置成0的时候,我们就看不到这个组件了
可以看到它就只需调用自身,没有其他的函数调用。
设置大小
这个就在之前的测试里做过的,因为大小为0的时候,它将不会被渲染出来,所以也就不会可视化出来。改变的是矩阵。
结论
在我看来我觉得还是设置大小是最优的显隐方案,用代码测试一次就好了。大家一起来看看还有什么情况是没有测试到的呢。