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()
↓
清除脏标记,完成更新
相关推荐
江上闲人.38 分钟前
Wardogs战犬\战狗Beta测试启动报错UE崩溃卡顿?解决方法来了
游戏·游戏引擎·虚幻·战犬·战狗·wardogs
小贺儿开发5 小时前
Unity 程序员编曲花絮:汪峰《河流》细节修复
科技·学习·unity·程序员·音乐·demo·写代码
598866753@qq.com6 小时前
Unity UniText笔记
unity·unitext
杨丰玮4186 小时前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(五)
java·python·游戏·游戏引擎·图形渲染·动画·贴图
鼎艺创新科技17 小时前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘
huihui36121 小时前
校友网管理软件技术选型框架:基于功能核验与系统架构的量化评估
unity·系统架构·游戏引擎
五仁烧饼21 小时前
Unity性能优化系列设置篇 - URP 移动端设置基线与分档策略
unity·游戏引擎
新手unity自用笔记1 天前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
心前阳光1 天前
Unity之XR Interaction Toolkit | IPointerDownHandler问题
unity·游戏引擎·xr
帅_shuai_2 天前
unity 静态字段内存查找工具
unity·游戏引擎