Unity UI 渲染与 Rebuild 机制简易解析

Graphic.Rebuild() 方法,是 Unity UI 系统核心的渲染更新机制。

Graphic.Rebuild() 方法详解

cs 复制代码
/// <summary>
/// Rebuilds the graphic geometry and its material on the PreRender cycle.
/// </summary>
public virtual void Rebuild(CanvasUpdate update)
{
    if (canvasRenderer == null || canvasRenderer.cull)
        return;

    switch (update)
    {
        case CanvasUpdate.PreRender:
            if (m_VertsDirty)  // 顶点数据脏标记
            {
                UpdateGeometry();  // 更新几何体(关键步骤!)
                m_VertsDirty = false;
            }
            if (m_MaterialDirty)  // 材质脏标记
            {
                UpdateMaterial();  // 更新材质
                m_MaterialDirty = false;
            }
            break;
    }
}
复制代码

完整的 UI 更新流程

Graphic 组件内部的各种脏标记检查逻辑 核心流程如下:

1. 脏标记系统(Dirty Flags)

cs 复制代码
public class Graphic : UIBehaviour
{
    // 各种脏标记
    protected bool m_VertsDirty;      // 顶点数据需要更新
    protected bool m_MaterialDirty;   // 材质需要更新
    protected bool m_ShouldRecalculateStencil;  // 模板测试需要重新计算
    protected bool m_ShouldRecalculateClipping; // 裁剪需要重新计算
    // ... 还有其他标记
}
复制代码

2. 触发脏标记的方法

cs 复制代码
// 这些方法会设置相应的脏标记
public virtual void SetVerticesDirty()
{
    if (!IsActive()) return;
    m_VertsDirty = true;
    CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);
}

public virtual void SetMaterialDirty()
{
    if (!IsActive()) return;
    m_MaterialDirty = true;
    CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);
}

public virtual void SetAllDirty()
{
    SetLayoutDirty();
    SetVerticesDirty();
    SetMaterialDirty();
}
复制代码

3. 完整的更新流程图

复制代码
当以下情况发生时:
1. 颜色/透明度变化
2. 材质变化
3. 纹理变化
4. RectTransform 变化
5. 启用/禁用组件
↓
调用 SetVerticesDirty() / SetMaterialDirty()
↓
注册到 CanvasUpdateRegistry
↓
等待 Canvas 的渲染循环
↓
CanvasUpdate.PreRender 阶段
↓
调用 Graphic.Rebuild(CanvasUpdate.PreRender)
↓
if (m_VertsDirty)
    UpdateGeometry() → OnPopulateMesh()
↓
if (m_MaterialDirty)
    UpdateMaterial()
↓
清除脏标记,完成更新
相关推荐
元气少女小圆丶2 小时前
SenseGlove Nova 2+Unity开发笔记1
笔记·学习·unity
mxwin3 小时前
Unity URP下新技术MSSPT 取代SSR和光线追踪
unity·游戏引擎·shader
LF男男6 小时前
IBuilder.cs 接口
unity
心之所向,自强不息7 小时前
# Unity MCP + Codex CLI 完整教程(Windows)
windows·unity·游戏引擎
KillJUMP8 小时前
GODOT SHADER关键函数
游戏引擎·godot
Oiiouui11 小时前
Godot(4.x): Python处理转换Excel为注入Json
游戏引擎·godot
追光者♂13 小时前
【测评系列3】CSDN AI数字营销实测体验官:测试 开源项目——Superpowers 游戏引擎从零开发实战指南
人工智能·深度学习·机器学习·typescript·开源·游戏引擎·superpowers
小拉达不是臭老鼠13 小时前
Unity数据持久化_Json
学习·unity
heimeiyingwang14 小时前
【架构实战】订单系统架构设计:电商核心系统的演进
unity·架构·系统架构
元气少女小圆丶14 小时前
SenseGlove Nova 2+Unity开发笔记3
笔记·unity·游戏引擎