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组件设置透明度的方式来进行显示与隐藏。

posted @   mc宇少  阅读(2347)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示