OpenHarmony轻智能图形渲染流程
DrawViewBounds() [调试模式]Callback() [定时触发]启动应用 (Ability启动)Attach到RootView。BaseGfxEngine接口。GfxEngines驱动封装。写入FrameBuffer。DrawUtils绘制工具。解析HML/CSS/JS。SoftEngine实现。屏幕刷新(VSync)
·
Goals
- 梳理从应用启动到渲染上屏的完整调用链
- 创建可视化时序图展示各模块间的交互关系
- 明确 ace_engine_lite、ui_lite、graphic_utils_lite 三个仓库的协作关系
Non-Goals
- 不涉及具体硬件驱动实现细节
- 不深入讨论JS引擎执行机制
渲染流程时序图
调用链路详解
阶段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命令
}
三个仓库的协作关系
关键数据流
| 数据类型 | 来源 | 去向 | 说明 |
|---|---|---|---|
| BufferInfo | GfxEngine | RootView | 帧缓冲区信息 |
| Rect | UIView | RootView | 无效区域矩形 |
| Style | ThemeManager | UIView | 样式信息 |
| TransformMap | UIView | GfxEngine | 变换矩阵 |
性能优化机制
- 脏区优化: 只重绘标记的无效区域,避免全屏刷新
- 视图树剪枝:
IsVisible()检查跳过不可见视图 - 透明度继承:
GetMixOpaScale()计算累积透明度 - 栈式遍历: 避免递归深度限制,支持更深的视图嵌套
更多推荐


所有评论(0)