这两天一直在搜索各种图形库的资料,但是自己却没有明确的目标。我不知道自己要用图形库来做什么,只能假设自己需要一个功能比较完善的图形库。

很久之前用 Win32+GDI 开发过截图程序,当初有一个问题没有解决就是抗锯齿,因为 GDI 不支持抗锯齿。想要实现抗锯齿功能,只能用其它的库。

所以我就以支持抗锯齿这个功能为切入点,开始调研当前流行的图形库。

从渲染硬件来看,图形库有两种分类:一种是 CPU 渲染,一种是 GPU 渲染。当然有的图形库同时支持 CPU 和 GPU 渲染。对于常规的 PC 应用来说,我感觉很多都已经支持 GPU 加速了,我其实很想知道如果不考虑没有 GPU 的硬件场景,是不是没有必要再去考虑 CPU 绘图呢?或者换一个问法:

在什么情况下,我用 CPU 绘图比用 GPU 绘图能带来更大的收益?

先列出一些我搜到图形库:

名称 平台 优缺点 编程语言 GPU/CPU
GDI Windows :系统原生、极快;
:功能简陋、不支持抗锯齿、无跨平台能力。
C CPU (硬件加速有限)
GDI+ Windows :API 易用、支持 Alpha 通道;
:性能较差(纯软件渲染)、不支持硬件加速。
C++ CPU
Cairo 跨平台 :矢量输出(PDF/SVG)极佳、API 稳定;
:缺乏现代 GPU 优化,渲染复杂场景较慢。
C CPU (支持多种后端)
Blend2D 跨平台 :目前最快的 CPU 矢量库、JIT 优化、多线程;
:相对年轻、GPU 后端仍在开发中。
C++ CPU (极致优化)
Skia 跨平台 :功能最强、Google 维护、工业级抗锯齿;
:体积巨大、构建链极复杂(需 GN/Ninja)。
C++ GPU & CPU
NanoVG 跨平台 :极轻量(仅几个文件)、API 类似 Canvas;:功能有限、仅支持简单的几何和文本。 C GPU (OpenGL/Vulkan)
SDL2 跨平台 :行业标准、底层控制力强、稳定;
:原生的渲染 API 非常基础(仅点/线/位图)。
C GPU & CPU
Raylib 跨平台 :无依赖、极简、即插即用、适合快速原型;
:不适合构建复杂的通用桌面软件 UI。
C GPU (OpenGL)
TGFX 跨平台 :腾讯出品、针对移动端和 Web 优化、轻量级;
:社区生态相比 Skia 较小。
C++ GPU

针对上面这些库,综合分析下来,最终还是选择 Skia 作为通用的绘图库。可能是功最全的库了。

GDI/GDI+

GDI/GDI+ 就不作过多介绍了,这两个库只能在 Windows 平台上用,并一直听说 GDI+ 很慢,但是我一般用静态渲染比较多,并且没有涉及大量绘图,所以感受不是很明显。虽然现在写软件没有实际跨平台的需求,但是还是跟着主流走吧。就不对这两个库作深入学习研究了。

Cairo

我本身倾向于使用C语言库,所以在选择 Skia 之前,我的首先是 Cairo 库,但是 Cairo 本身不支持文本布局,需要依赖 Pango 库,在 Windows 进行静态编译,不如 Skia 方便。等有时间再尝试 Windows 下静态编译这个库。虽然网上也说它的性能不如 Skia 但是还是那句话,很多时候我并不需要那么高的性能。

Blend2D

Blend2D 我没试用过,但它的宣称是最快的 CPU 渲染,当确实必须要用 CPU 渲染时,可以试试它。不过最近查看它的主页,因为被白嫖,没有资助,作者已经不更新了。同样它也不内置中文排版。其实文字排版本身是另一项庞大的工程,能够的内置这个功能的可能也就 Skia 了。

Skia

调研一圈下来,发现功能最全集成度最好的,就是 Skia 库了。它是 Chrome 浏览器的基础库。也曾是 Flutter 的基础库。我最关心的文本排版渲染,它也是支持的。按照编译指令,我也成功编译了,并且开发程序也比较方便。需要注意的一点是在 Windows 平台,一定要用 clang-cl 来编译。同样的测试程序,用 msvc 来编译,跑到 15 帧/秒时,CPU 利用率就是 25% 了,而换成 clang-cl 后,跑到 50 帧/秒, CPU 的利用率才 0.2 %。这个差距真是太大了。

NanoVG

这个库是我第一次听说,看起来挺不错的,API 类似 Canvas,如果有需要作一些特别小的玩具,可能会尝试一下。

SDL2

把 SDL2 单纯的称作图形库可能不太合适,它提供的功能远远超出图形本身,可以说是一套完善的程序开发框架了。更多场景是用它来开发游戏,但是用它开发应用有时候也是挺不错的,比如我之前用过的 lite/lite-xl 这个文本编辑器,觉得很还是新奇的,有机会一定要好好研究一番。如果只能学一个图形框架,我肯定选这个。

Raylib

Raylib 由西班牙开发者 Ramon Santamaria(网名 Ray)于 2013 年左右开始开发。他当初开发这个库的目的只是为了用来教学,没想到最终能够成为受众那么多的流行库。很多时候,其实可以作为 SDL 的平替。这个也是我想深入学习的库,它在我心中的地位仅次于 SDL2 , 不是因为它不够好,仅仅是因为我觉得 SDL2 的生态比它丰富吧。也许从学习顺序来说,我会优先学学这个库。

TGFX

这是搜索资料时偶然看到腾讯开源的图形库,从介绍上来看功能是对齐 Skia 的,并且体积比较小。但是不知道为什么生态没有起来,有机会可以试试。