返回「计算机、信息技术与工程」
如何优化UI中大量使用SetActive(true)/(false)
本文目录 3 个章节
如何优化UI中大量使用SetActive(true)/(false)
note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。
问题
在UI的日常开发中为了显示隐藏某些GO使用了大量的SetActive(true)/(false)代码,由于SetActive的开销过大是否有其他解决方案
- 提问者:zyy
- 提问时间:2021-03-26 00:32:32
我的回答
这种情况下Active/Deactive的开销主要有两个方面:
- C#层到Native层的穿梭调用速度比C#层内的速度慢。
- UI元素的变化导致所在的Canvas变化,触发函数Canvas.SendWillRenderCanvases()与Canvas.BuildBatch()造成高耗时。
因此,优化也可以从以下几点考虑:
- 在C#层设置变量来标识相应的GO处于Active还是非Active状态,避免对Active的对象进行SetActive(true),避免对非Active的对象进行SetActive(false)。
- 将要频繁变化的UI元素与不频繁变化的UI元素放在不同的Canvas中,减少UI元素变化时的耗时。
- 通过将UI元素的坐标移动到Canvas的范围之外的方法来显示与隐藏,避免SetActive的耗时以及SendWillRenderCanvases的耗时
- 另外,经测试,对Component进行 enabled = false 的操作比对GO进行SetActive(false)的操作耗时低。
2021.3.27 更新:
经题主提示,导致开销的还有一个方面:UI元素的网格顶点数组改变会造成堆内存分配,触发GC,导致耗时。不过对UI元素进行位置移动不会造成堆内存分配。
优化方法增加一条:通过添加CanvasGroup组件设置透明度的方式来进行显示与隐藏。
- 回答时间:2021-03-26 02:13:30
- 最后更新:2021-03-29 02:52:36
- 采纳状态:未采纳
来源与关系
- 上位集合:我的 UWA 问答
- UWA 标签:UI、资源管理、UGUI、终端平台
- 原始问题:如何优化UI中大量使用SetActive(true)/(false)
- 源页最后更新:2021-03-29 03:06:51