前言
我们在前面的文章中讲到,Skia 负责生成绘图指令。但最终这些指令是如何驱动 GPU(显卡)画出像素的?
在不同的平台上,Skia 面向的后端(Backends)截然不同。今天我们来一场图形学的跨平台深度探索。
一、各平台的后端矩阵
| 平台 | 主要图形 API (Backend) | 特点 |
|---|---|---|
| iOS / macOS | Metal | Apple 自家,低功耗、高性能,替代了旧的 OpenGL。 |
| Android | Vulkan / OpenGL ES | 现代 Android 优先使用 Vulkan,兼容性回退至 OpenGL ES。 |
| Windows | DirectX / Vulkan | 通过 ANGLE 层转换或直接使用 Vulkan。 |
| Web | WebGL / WebGPU | 运行在浏览器的安全沙箱中。 |
二、Skia 的“多面手”角色
Skia 内部维护了一套 GrContext (GPU Context)。它的作用是将 Skia 统一的绘图指令转换为特定 API 的指令。
- 录制阶段:Skia 先将
drawCircle等指令记录在一个SkPicture中。 - 转译阶段:Skia 根据当前的 GPU 上下文,将
SkPicture转换为 Metal 命令流或 Vulkan 指令流。 - 光栅化:GPU 执行这些指令,将数学上的圆变成像素点。
三、Compose Multiplatform 的挑战
对于 CMP 来说,最大的挑战在于 “窗口管理(Windowing)” 与 “同步”。
- iOS 侧:CMP 必须向 iOS 申请一个
CAMetalLayer,并确保 Compose 的渲染循环与 iOS 系统的CADisplayLink同步,否则会出现画面撕裂。 - Android 侧:必须与系统的
SurfaceView或TextureView深度集成。
四、为什么资深开发要懂这个?
- 硬件兼容性调试:如果你的 App 在某些老旧安卓机上 UI 闪烁,可能就是 Vulkan 驱动兼容性问题,这时你可能需要手动强制切换到 OpenGL 模式。
- 功耗优化:Metal 和 Vulkan 这种底层 API 比 OpenGL 更省电。理解它们的工作原理,能帮你写出更环保的动画逻辑。
五、架构思考
在这个层面,Android、iOS、Web 的界限已经完全模糊了。 我们面对的是:如何在有限的硬件带宽下,调度 GPU 完成最高质量的画面呈现。 这也是为什么我们之前引入 CInterop 调用 C 库 如此重要,因为很多高性能的图形前处理逻辑,本身就是用 C++ 写的。
🏗️ 源码关键点
org.jetbrains.skia.DirectContextorg.jetbrains.skiko.SkiaLayerProperties
结语
图形 API 是 UI 开发的最后一块拼图。理解了它们,你就拥有了真正意义上的“全栈渲染视野”。
下一篇是大结局:极致性能实战 —— 利用底层原理解决 Compose 的掉帧疑难杂症。