Unity避免SetActive的使用(转)


转自:如何优化UI中大量使用SetActive的问题 - UWA Blog (uwa4d.com)

SetActive的开销主要有几个方面

1.C#层到Native层的穿梭调用速度比C#层内慢。

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

3.UI元素的网格顶点数改变会造成堆内存分配,触发GC,导致耗时(不过对UI元素进行位置移动不会造成堆内存分配)。

因此优化也可以从以下几点考虑:

1.在C#层设置变量来标识相应的GO处于Active还是非Active状态,避免对Active的对象进行SetActive(true),避免对非Active的对象进行SetActive(false)。

对Active进行SetActive(true)时,“底层”会进行判断,但调用的时候,就已经是从C#层调用底层,导致开销较高。在C#层判断好,就避免了让底层判断。

2.将要频繁变化的UI元素与不频繁变化的UI元素放在不同的Canvas中,减少UI元素变化时的耗时。

3.通过将UI元素的坐标移动到Canvas的范围之外的方法来显示与隐藏,避免SetActive的耗时以及SendWillRenderCanvases的耗时。

4.要更改单个UI的显隐可以通过GetComponent<CanvasRenderer>().SetAlpha(0);来实现,并且勾上CanvasRender.cullTransparentMesh使其不渲染网格,但是这样做还是会触发update等函数并且会触发点击事件。

5.要更改父物体的显隐可以通过添加CanvasGroup组件设置透明度的方式来进行显示与隐藏。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM