skia

义项:开源2D图形渲染库
skia

skia是开源的 2D 图形库(Skia Graphics Library),以 C++ 编写,向调用方提供一套在多种硬件与操作系统平台上通用的绘图接口[1][2]。它由谷歌(Google)赞助并管理,以 BSD 许可证向任何人开放使用[2]。skia 长期充当谷歌浏览器(Chrome)、Chrome OS、安卓(Android)、Flutter 等产品的图形引擎,是把矢量图形、文本与图像绘制到屏幕或输出为 PDF 的底层组件之一[2][3]。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

skia 是一个开源的 2D 图形库,用 C++ 编写,提供一套能在不同硬件与软件平台上使用的通用绘图接口[1][2]。它的作用是把与平台相关的图形 API 差异屏蔽在库内部,上层程序只需面向 skia 的接口描述要画什么,不必分别对接 Windows、macOS、安卓等系统各自的绘图机制[4]。

skia 的核心抽象是画布对象 SkCanvas,绘制矩形、路径、文本等操作都经由画布发起;被绘制图元的颜色、描边、字体、混合方式等样式属性则由 SkPaint 对象承载[5]。画布本身保存的是一组矩阵与裁剪区域,用于决定图形最终落在表面的哪个位置[5]。

作为基础组件,skia 并不提供控件、窗口或事件循环,只负责把绘制指令转换为像素、PDF 或经由图形处理器产生的渲染结果[2][1]。项目由谷歌赞助与管理,源码以 BSD 自由软件许可证发布,第三方可以自由使用和提交改动[2]。

原理

skia 的绘制流程可以概括为“记录指令—生成几何—光栅化或提交后端”。应用将绘制调用交给 SkCanvas,画布结合当前变换矩阵把图元坐标映射到目标表面,再按 SkPaint 描述的样式生成可执行的绘制步骤[5]。对外暴露的关键类型包括 SkPath(由直线和曲线构成的路径)、SkMatrix(3×3 变换矩阵)、SkBitmap(二维像素数组)、SkSurface(绘制目标)等[5]。

在纯软件路径上,skia 使用基于 CPU 的光栅化器把矢量图元填充为像素[1]。在硬件加速路径上,它通过 Ganesh 这一图形处理器后端,把绘制工作交给 OpenGL、Vulkan、Metal、Direct3D 等不同图形 API 执行,调用方先创建 GPU 上下文,再从该上下文得到 GPU 支撑的绘制表面,绘制完成后提交命令[6][7]。

设原点为 $O$,绘制点坐标为 $P$,画布变换矩阵为 $M$,则落到设备空间的坐标可写为 $P' = M \cdot P$,裁剪区域再对 $P'$ 做归属判断[5]。除屏幕输出外,该库还带有 PDF 等文档后端,可把同一批绘制指令转写为矢量文档[1]。


flowchart LR

A[应用调用 SkCanvas 绘制] --> B[按 SkPaint 与 SkMatrix 生成几何]

B --> C{目标表面类型}

C -->|CPU| D[软件光栅化 SkBitmap]

C -->|GPU| E[经图形 API 提交]

D --> F[像素输出]

E --> F

B --> G[PDF 等文档后端]

发展历程

skia 最初由同名公司 Skia Inc. 开发,该公司 2004 年由 Mike Reed 与 Cary Clark 在美国北卡罗来纳州教堂山(Chapel Hill)创立[1][8]。谷歌在 2005 年收购了这家公司,随后在 2008 年以新版 BSD 自由软件许可证把该库作为开源软件发布[1][4]。

被收购后的数年间,项目对外披露不多;2007 年前后,与安卓平台图形能力相关的代码公开,此后谷歌浏览器也采用了这一绘图引擎[9]。随着安卓与开源浏览器项目 Chromium 陆续开放源码,skia 的源码也一并公开,其中安卓与 Chromium 各自维护一份因平台衔接需要而做过调整的副本[9]。

进入 2010 年代,skia 成为多个大型项目的图形基础,覆盖 Chrome、Chrome OS、安卓、Firefox 与 Firefox OS,并出现在 Sublime Text 3、BlackBerry PlayBook 等产品中[1]。其后版本号与 Chromium 的里程碑版本对齐,源码树中可查到的分支编号如 m118、m133 等即对应这一编号体系[10][11]。

图形处理器后端方面,长期承担加速任务的 Ganesh 之后出现替代方案 Graphite。Graphite 采用先记录后提交的模型,支持多线程录制与流水线预编译,已随 Chrome 在采用苹果芯片的 Mac 上投入使用,而 Ganesh 中的 Dawn 支持在 m118 版本被移除[10]。2024 年 3 月,曾有发行版维护者提出把 skia 纳入 Debian 打包,文件名与包名以 libskia 命名[12]。

应用

网页浏览器是 skia 最主要的应用场景之一。谷歌浏览器与 Chromium 以其作为渲染图形的底层引擎,Mozilla Firefox 同样使用 skia 完成画布等绘制工作[2][1]。基于 Chromium 的浏览器在导出 PDF 时,文档元数据中的生成器字段常显示为 Skia/PDF 加版本号,可作为该库参与文档生成的痕迹[13]。

在移动与桌面操作系统层面,安卓与 Chrome OS 把 skia 用作系统级绘图组件,界面元素与文字最终都由此转化为像素[2]。跨平台应用框架 Flutter 也长期依赖它渲染界面;截至 Flutter 网站文档所述版本,Web 端仍由 skia 负责渲染,其 CanvasKit 包直接调用 skia 而不经过 C++ 引擎组件[14]。

桌面办公软件中亦可见其身影,LibreOffice 自 7.1 版起提供可选的 skia 渲染后端,可在 Vulkan 或 Metal 上创建离屏表面,创建失败时回退到光栅渲染[13][15]。此外,各语言社区围绕它构建了绑定层,例如 .NET 的 SkiaSharp 和 Rust 的 skia-safe,使 skia 的绘图能力可被 C++ 以外的语言调用[7][16]。

局限

skia 只覆盖绘图本身,不处理窗口系统、输入事件或界面控件,也不直接对接 Linux Framebuffer、GTK 等底层环境,因此使用方往往需要自己补一层适配代码,安卓与 Chromium 各自维护修改过的源码副本正是出于这一原因[9]。

在 GPU 路径上,着色器需在运行时编译,应用首次进入性能敏感界面时可能出现编译引起的卡顿,这一问题在 Flutter 等框架中有明确记录,也是其另建渲染引擎的动因之一[14]。作为替代的 Graphite 后端目前不直接支持 OpenGL 与 Direct3D,仍需借助其他抽象层覆盖这些平台[10]。

该库的界面表现还受运行环境影响:在 LibreOffice 等宿主程序中,GPU 上下文创建失败时会退回纯软件光栅,复杂图形与动画的性能随之下降[15]。发行版打包方面,其构建依赖较多,长期缺少正式软件包,Debian 直到 2024 年才出现正式的纳入请求,此前仅以浏览器内嵌副本的形式存在[12][17]。

参见

  • Flutter —— 采用 skia 作为图形引擎的跨平台应用框架。

  • Chromium —— 以 skia 为渲染底层并内嵌其源码的开源浏览器项目。

  • Cairo —— 功能定位相近的另一款开源 2D 矢量绘图库。

  • OpenGL —— skia 硬件加速路径可对接的图形 API 之一。

  • PDF —— skia 可输出的文档格式,由独立后端处理。

  • 光栅化 —— skia 将矢量图形转换为像素的核心步骤。

参考资料

  1. Skia Graphics Engine [引用日期2026-10-29]
  2. Documentation [引用日期2026-10-29]
  3. site/about/_index.html [引用日期2026-10-29]
  4. Skia Graphics Engine [引用日期2026-10-29]
  5. API Reference and Overview [引用日期2026-10-29]
  6. GPU Backend System | rust-skia/rust-skia | DeepWiki [引用日期2026-10-29]
  7. GPU Acceleration | mono/SkiaSharp | DeepWiki [引用日期2026-10-29]
  8. Skia Graphics Engine [引用日期2026-10-29]
  9. skia [引用日期2026-10-29]
  10. github.com 上的网页 [引用日期2026-10-29]
  11. third_party_skia:基于 Skia 技术的 2D 图形库项目 [引用日期2026-10-29]
  12. bugreport [引用日期2026-10-29]
  13. Skia/PDF Creator & Producer - PDF Metadata Explained [引用日期2026-10-29]
  14. Frequently Asked Questions [引用日期2026-10-29]
  15. vcl/skia/SkiaHelper.cxx - = sharedWindowContext [引用日期2026-10-29]
  16. README [引用日期2026-10-29]
  17. bugreport [引用日期2026-10-29]
词条评价
词条统计

浏览次数:1 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:21:44Z

历史版本

本条目引用的词条
Flutter Chromium Cairo OpenGL PDF 光栅化