Goals

  • 梳理从应用启动到渲染上屏的完整调用链
  • 创建可视化时序图展示各模块间的交互关系
  • 明确 ace_engine_lite、ui_lite、graphic_utils_lite 三个仓库的协作关系

Non-Goals

  • 不涉及具体硬件驱动实现细节
  • 不深入讨论JS引擎执行机制

渲染流程时序图

显示驱动 (FrameBuffer) GfxEngines (驱动封装) DrawUtils (绘制工具) BaseGfxEngine (图形引擎) UIView (视图组件) RenderManager (渲染调度) RootView (根视图) ViewManager (视图管理) ACE Engine lite 应用层 (JS/HML/CSS) 显示驱动 (FrameBuffer) GfxEngines (驱动封装) DrawUtils (绘制工具) BaseGfxEngine (图形引擎) UIView (视图组件) RenderManager (渲染调度) RootView (根视图) ViewManager (视图管理) ACE Engine lite 应用层 (JS/HML/CSS) 阶段1: 应用初始化 阶段2: 视图树构建 阶段3: 无效区域标记 阶段4: 渲染调度触发 阶段5: 视图树绘制 alt [有子视图] loop [遍历视图树] 阶段6: 缓冲区刷新上屏 alt [软件渲染] [硬件加速] 启动应用 (Ability启动) 解析HML/CSS/JS 创建组件树 Attach到RootView InitDrawContext() GetFBBufferInfo() 返回帧缓冲区信息 setState/setProperty Invalidate() AddInvalidateRect(rect) OptimizeAddRect(rect) Callback() [定时触发] Measure() MeasureView() ReMeasure() Render() RenderRect(flushRect) GetTopUIView(mask) DrawTop(view, rect) OnDraw(buffer, rect) DrawRect() / DrawLine() / Blit() FillAreaWithSoftWare() 完成绘制 递归绘制子视图 OnPostDraw(buffer, rect) DrawViewBounds() [调试模式] Flush(flushRect) GfxFillArea() / GfxBlit() 写入FrameBuffer GPU命令提交 屏幕刷新(VSync)

调用链路详解

阶段1: 应用初始化

步骤 调用方 被调用方 关键文件
1 应用层 ACE Engine ace_engine_lite/frameworks/src/core/
2 ACE Engine ViewManager ui_lite/frameworks/common/
3 ViewManager RootView ui_lite/frameworks/components/root_view.h

阶段2: 视图树构建

// RootView::InitDrawContext()
void RootView::InitDrawContext()
{
    dc_.bufferInfo = BaseGfxEngine::GetInstance()->GetFBBufferInfo();
    InitMapBufferInfo(dc_.bufferInfo);  // 初始化变换缓冲区
}

阶段3: 脏区标记

// UIView::Invalidate() -> RootView::AddInvalidateRect()
void UIView::Invalidate()
{
    // 向上遍历找到RootView
    while (view != nullptr) {
        if (view->transMap_ != nullptr && !view->GetTransformMap().IsInvalid()) {
            InvalidateRect(view->GetRect(), view);
            return;
        }
        view = view->parent_;
    }
    InvalidateRect(GetFullRect());  // 标记完整区域
}

阶段4: 渲染调度

// RenderManager::Callback() 定时触发
void RenderManager::Callback()
{
    RootView* rootView = RootView::GetInstance();
    rootView->Measure();   // 测量阶段
    rootView->Render();    // 渲染阶段
    UpdateFPS();          // FPS计算
}

阶段5: 视图树绘制

// RootView::DrawTop() - 核心绘制逻辑
void RootView::DrawTop(UIView* view, const Rect& rect)
{
    // 栈式遍历视图树
    while (par != nullptr) {
        if (curView->IsVisible()) {
            curView->OnDraw(*dc_.bufferInfo, curViewRect);  // 绘制
            // 递归子视图...
            curView->OnPostDraw(*dc_.bufferInfo, curViewRect); // 后处理
        }
        curView = curView->GetNextRenderSibling();
    }
}

阶段6: 缓冲区刷新

// BaseGfxEngine::Flush()
void SoftEngine::Flush(const Rect& flushRect)
{
    // 软件渲染直接写入FrameBuffer
    // 硬件渲染提交GPU命令
}

三个仓库的协作关系

graphic_utils_lite

ui_lite

ace_engine_lite

JS解析器

组件工厂

布局引擎

UIView/ViewGroup

RootView

RenderManager

BaseGfxEngine接口

SoftEngine实现

GfxEngines驱动封装

DrawUtils绘制工具

图形数学工具

显示驱动

关键数据流

数据类型 来源 去向 说明
BufferInfo GfxEngine RootView 帧缓冲区信息
Rect UIView RootView 无效区域矩形
Style ThemeManager UIView 样式信息
TransformMap UIView GfxEngine 变换矩阵

性能优化机制

  1. 脏区优化: 只重绘标记的无效区域,避免全屏刷新
  2. 视图树剪枝: IsVisible() 检查跳过不可见视图
  3. 透明度继承: GetMixOpaScale() 计算累积透明度
  4. 栈式遍历: 避免递归深度限制,支持更深的视图嵌套
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐