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()
↓
清除脏标记,完成更新
相关推荐
丁小未10 小时前
基于MVVM框架的XUUI HelloWorld 新手教程
unity·性能优化·c#·游戏引擎
丁小未11 小时前
基于MVVM框架的XUUI MoreComplex案例
unity·c#
EQ-雪梨蛋花汤11 小时前
【Unity笔记】VR 一体机画面锯齿、模型边缘闪烁、接缝抖动排查:MSAA、Mipmap、Render Scale、Z-Fighting 全流程记录
笔记·unity·vr
松树戈15 小时前
【Godot4精进之路】03~Godot编辑器常用界面介绍
编辑器·游戏引擎·godot
YigAin15 小时前
Unity Spine 资源出现白边的解决办法
unity·游戏引擎·spine
郝学胜-神的一滴1 天前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
_helen_5202 天前
unreal engine 虚拟现实 + airsim
游戏引擎·vr·虚幻
真鬼1233 天前
【Unity WebGL】内嵌网页与双向通信
unity·游戏引擎·webgl
zyh______4 天前
C#语法糖(按照实用性排序)
unity·c#
avi91114 天前
[AI教做人]CinemachineCamera 各项调整配置参数入门 + Profiler
unity·游戏开发·camera·cinemachine·visual camera·镜头配置