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()
↓
清除脏标记,完成更新
相关推荐
mxwin14 小时前
Unity Shader FLOWMAP岩浆流动制作案例
unity·游戏引擎·shader·uv
小贺儿开发14 小时前
【Arduino与Unity交互探究】01 摇杆模块
科技·unity·游戏引擎·arduino·串口通信·摇杆·硬件交互
Yasin Chen16 小时前
Unity TMP_SDF 分析(三)顶点着色器1
unity·游戏引擎·着色器
mxwin17 小时前
Unity Shader 使用 Noise 图 制作Shader 溶解效果
unity·游戏引擎
mxwin19 小时前
Unity Shader 用 Ramp 贴图实现薄膜干涉效果
unity·游戏引擎·贴图·shader·uv
魔士于安19 小时前
Unity星球资源,八大星球,带fps显示
游戏·unity·游戏引擎·贴图·模型
张老师带你学21 小时前
unity资源,深空陨石,适合太空背景的游戏开发
游戏·unity·模型
鹿野素材屋1 天前
Unity动画幅度太大怎么办
unity·游戏引擎
垂葛酒肝汤1 天前
Unity Sprite Rect 越界问题笔记
笔记·unity·游戏引擎
平行云1 天前
数字孪生信创云渲染系列(一):混合信创与全国产化架构
unity·ue5·3dsmax·webgl·gpu算力·实时云渲染·像素流送