Compose 渲染内核 (7):图形 API 战纪 —— Metal, Vulkan 与 OpenGL

0 阅读2分钟

前言

我们在前面的文章中讲到,Skia 负责生成绘图指令。但最终这些指令是如何驱动 GPU(显卡)画出像素的?

在不同的平台上,Skia 面向的后端(Backends)截然不同。今天我们来一场图形学的跨平台深度探索。


一、各平台的后端矩阵

平台主要图形 API (Backend)特点
iOS / macOSMetalApple 自家,低功耗、高性能,替代了旧的 OpenGL。
AndroidVulkan / OpenGL ES现代 Android 优先使用 Vulkan,兼容性回退至 OpenGL ES。
WindowsDirectX / Vulkan通过 ANGLE 层转换或直接使用 Vulkan。
WebWebGL / WebGPU运行在浏览器的安全沙箱中。

二、Skia 的“多面手”角色

Skia 内部维护了一套 GrContext (GPU Context)。它的作用是将 Skia 统一的绘图指令转换为特定 API 的指令。

  1. 录制阶段:Skia 先将 drawCircle 等指令记录在一个 SkPicture 中。
  2. 转译阶段:Skia 根据当前的 GPU 上下文,将 SkPicture 转换为 Metal 命令流或 Vulkan 指令流。
  3. 光栅化:GPU 执行这些指令,将数学上的圆变成像素点。

三、Compose Multiplatform 的挑战

对于 CMP 来说,最大的挑战在于 “窗口管理(Windowing)”“同步”

  • iOS 侧:CMP 必须向 iOS 申请一个 CAMetalLayer,并确保 Compose 的渲染循环与 iOS 系统的 CADisplayLink 同步,否则会出现画面撕裂。
  • Android 侧:必须与系统的 SurfaceViewTextureView 深度集成。

四、为什么资深开发要懂这个?

  • 硬件兼容性调试:如果你的 App 在某些老旧安卓机上 UI 闪烁,可能就是 Vulkan 驱动兼容性问题,这时你可能需要手动强制切换到 OpenGL 模式。
  • 功耗优化:Metal 和 Vulkan 这种底层 API 比 OpenGL 更省电。理解它们的工作原理,能帮你写出更环保的动画逻辑。

五、架构思考

在这个层面,Android、iOS、Web 的界限已经完全模糊了。 我们面对的是:如何在有限的硬件带宽下,调度 GPU 完成最高质量的画面呈现。 这也是为什么我们之前引入 CInterop 调用 C 库 如此重要,因为很多高性能的图形前处理逻辑,本身就是用 C++ 写的。


🏗️ 源码关键点

  • org.jetbrains.skia.DirectContext
  • org.jetbrains.skiko.SkiaLayerProperties

结语

图形 API 是 UI 开发的最后一块拼图。理解了它们,你就拥有了真正意义上的“全栈渲染视野”。

下一篇是大结局:极致性能实战 —— 利用底层原理解决 Compose 的掉帧疑难杂症