HWUI 和 Skia

📌 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 <应用包名>
相关推荐
Damon_X2 天前
DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC
display
Damon_X3 个月前
SurfaceFlinger代码笔记
display
Damon_X3 个月前
帧缓存的分配
display
锦天8 个月前
弹性布局 flex layout HTML CSS
css·html·display·flex·弹性布局·justify-content·flex layout
唐诺1 年前
Android 获取屏幕方向,根据屏幕旋转角度判断屏幕实际方向
android·display·windowmanager·rotation
Laurence2 年前
在 spark-sql / spark-shell / hive / beeline 中粘贴 sql、程序脚本时的常见错误
hive·sql·spark·display·possibilities