---
title: "如何优化UI中大量使用SetActive(true)/(false)"
author: "石心.Yong"
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/uwa-answer-optimize-frequent-set-active-ui/
type: note
content_role: source
source_type: "source"
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/05-游戏图形与运行时/我的UWA问答/2021-03-26 - 如何优化UI中大量使用SetActive(true)-(false).md"
content_hash: 9b33feffa44d3b25132fedcebd02dd62dac41ff48bf4eba0e9f82538757b3594
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 如何优化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()造成高耗时。

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

1. 在C#层设置变量来标识相应的GO处于Active还是非Active状态，避免对Active的对象进行SetActive(true)，避免对非Active的对象进行SetActive(false)。
2. 将要频繁变化的UI元素与不频繁变化的UI元素放在不同的Canvas中，减少UI元素变化时的耗时。
3. 通过将UI元素的坐标移动到Canvas的范围之外的方法来显示与隐藏，避免SetActive的耗时以及SendWillRenderCanvases的耗时
4. 另外，经测试，对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 问答](https://www.pystone.net/notes/my-uwa-answers/)
- UWA 标签：UI、资源管理、UGUI、终端平台
- 原始问题：[如何优化UI中大量使用SetActive(true)/(false)](https://answer.uwa4d.com/question/605c4aa0cfa35d5b53669c57)
- 源页最后更新：2021-03-29 03:06:51
