这两天一直在搜索各种图形库的资料,但是自己却没有明确的目标。我不知道自己要用图形库来做什么,只能假设自己需要一个功能比较完善的图形库。
很久之前用 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 的,并且体积比较小。但是不知道为什么生态没有起来,有机会可以试试。