HWUI 和 Skia

发布于:2025-02-27 ⋅ 阅读:(19) ⋅ 点赞:(0)

📌 HWUI 和 Skia 的关系

  1. Skia 是 Android 的底层 2D 图形库,提供 CPU 和 GPU 渲染能力,支持 OpenGL、Vulkan、Metal 等后端。
  2. HWUI 是 Android UI 组件的 GPU 渲染引擎,主要用于 加速 View、动画、阴影等 UI 元素的绘制
  3. HWUI 依赖 Skia 进行实际的绘制,但它有自己的一套绘制管理逻辑,并优化了 Android UI 的绘制流程

📌 HWUI 如何使用 Skia

从 Android 10(API 级别 29)开始,HWUI 完全迁移到 Skia GPU 渲染,主要基于 Skia 的 OpenGL/Vulkan 后端 进行 GPU 计算。

🔹 主要架构

Android UI 绘制
  ├── 应用层:View (TextView, ImageView, etc.)
  ├── Framework:Canvas API (drawXXX)
  ├── **HWUI(渲染引擎)**
  │   ├── RenderThread
  │   ├── DisplayListRenderer
  │   ├── SkiaGL/VulkanPipeline  <--- 这里使用 Skia 进行 GPU 渲染
  │   └── OpenGL/Vulkan(GPU 计算)
  ├── SurfaceFlinger(合成)
  ├── 硬件层(GPU/DPU 显示)

🔹 关键点

  1. 应用调用 View.draw(Canvas)

    • Canvas.drawXXX() 其实是 HWUI 提供的 Skia Canvas,不是纯 Skia。
    • HWUI 维护了一套 DisplayList,用于存储绘制指令。
  2. HWUI 使用 Skia 进行 GPU 绘制

    • HWUI 通过 SkiaGLPipelineSkiaVulkanPipeline 将 DisplayList 转换成 Skia 绘制命令。
    • Skia 生成 OpenGL/Vulkan 渲染指令,交给 GPU 进行计算。
  3. 最终输出到 SurfaceFlinger

    • HWUI 处理完成后,将渲染结果写入 Surface,再由 SurfaceFlinger 进行合成。

📌 结论

HWUI 依赖 Skia 进行 GPU 渲染,但它有自己的一套绘制逻辑,并不是简单的 Skia 封装。
Skia 负责底层绘制,而 HWUI 负责 UI 组件的绘制管理(比如 DisplayList、动画、缓存)
Android 10 之后,HWUI 不再直接操作 OpenGL,而是完全基于 Skia GPU 渲染

使用 adb shell dumpsys gfxinfo 命令,查看 GPU 渲染状态:

adb shell dumpsys gfxinfo <应用包名>