Skia兼容性好,API丰富,稳定高效,维护积极,软渲染、硬件加速能力都有,Android、Chrome、Firefox、LibreOffice都用它。
但它也是坑最多的库。首先是版本选择的问题:Skia版本更新非常频繁,大概每四周就会创建一个新版本,此版本持续维护六周左右就会被标记为稳定分支:
这就导致一个问题:每个新版本多多少少都会有一些Breaking Changes。导致很多使用Skia的开发者不敢升Skia的版本。这也是为什么 SkiaSharp 的作者要花好几个月来更新Skia版本的原因(本文后面有相关贴图)。
我建议别选最新的,也别选太老的,我一般选半年内,1个月前的版本。
接着是编译,编译前你至少得先搞明白GN/Ninja那一套构建工具(Google开源项目大都用这一套工具构建),而且Skia依赖了好多第三方库,这些库在编译前要同步好(有同步工具),也就是说你得有一个优秀的科学上网工具。
然后再去研究Skia那一大堆编译参数,参数配不好有时也能得到编译产物,但很可能会面临这位老哥遇到得问题:
这是我的编译参数,亦不完美:
bin/gn gen out/debug --args='clang_win=\"C:\Program Files\LLVM\" cc=\"clang\" cxx=\"clang++\" extra_cflags=[\"/MTd\"] is_official_build=true is_debug=false skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_system_harfbuzz=false skia_use_system_icu=false skia_use_gl=true skia_enable_skparagraph=true skia_enable_skshaper=true skia_enable_skunicode=true'
除此之外,Skia内部还有好多技术体系,你知道Ganesh和Graphite是干嘛的吗?哪个正准备弃用,哪个是正在研发中?类似这样的问题有的时候就连非常专业的 Skia 开发者都搞不明白,如下是微软开源项目 SkiaSharp 的作者的疑问(Avalonia是基于此项目开发的):
Ganesh和Graphite是两组技术,Ganesh更老更稳定,Graphite更新、更快(多线程支持更好)、更不稳定,但它是趋势,是Skia团队的主攻方向。Chrome已经在个别地方使用Graphite了。
假设你已经克服了这些困难,到你使用Skia库得时候,又会面临选择什么渲染后端的问题,Skia支持多种渲染后端:OpenGL,Vulkan,Metal,Direct3D,Dawn,Angle,SwRaster,这些后端都有啥区别你搞的明白不?
如果你看到Direct3D,眼前一亮,心想,别的都不用看了,我要的就是这个,我只要搞Windows应用,其他肯定都没这个好。
那么恭喜你,入坑了。早在2022年,Skia团队就想移除Direct3D了。
正确答案是:你应该选择Angle后端,它在 Direct3D 上做 OpenGL 仿真。
也就是说这个后端让 Direct3D 执行 OpenGL 的渲染指令。
由于要使用动态库的函数指针,所以这个后端会让你的应用程序多出两个动态库:libEGL.dll,libGLESv2.dll,大概20M,裁剪不掉,还没办法静态链接。
如果你一听到“仿真”就厌了,打算用 Vulkan 或者 OpenGL 代替,唉,仍然各有各的问题,LibreOffice 的作者不信邪,下面是他们踩的坑:
再聊聊渲染大段文本的事儿,这是一个很常见得需求吧,但要想实现这个需求可没那么简单,想想看:一段文本中有不同字体,不同字号的文字,还要自动换行,你该如何处理呢?
Skia为此提供了一个附加库:skparagraph,但是,这个库要依赖icu,光一个icudtl.dat就得十几兆,性能也不见得有多好(Android就没用这个库)。
你自己实现吧,也不是不可以,但这里面还是有很多坑,比如:你不能用font.measureText这样的方法来测量文本宽度,因为这样算出来的结果不准,尤其是中英文混合的情况下(就算是同一个字体,也算不准)。你得用先搞到字型(font.textToGlyphs),然后再根据字型得到每个字的具体宽度(font.getWidthsBounds),
类似这样的坑还挺多的,要实现某个效果,可能有多种不同得API组合方案,哪个好,哪个坏得你自己摸索,官网文档少的可怜。
尽管如此,Skia仍然称霸2D渲染引擎领域近20年,但这也导致 Skia 的历史包袱也非常重,它要同时兼容软渲染和硬件加速渲染,导致它很多时候不能为现代GPU做极致优化。
腾讯的 TGFX 特殊场景渲染性能可以做到 Skia 的 10 倍以上,详见:https://github.com/Tencent/tgfx/issues/381
最后总结一下,
搞Skia肯定有钱途,但搞Skia势必要拿出大量的时间和精力来踩坑,当然这些坑在一定程度上也构成了门槛。让你别具竞争力。
唉,满屏荒唐言,一把辛酸泪,都云作者痴,谁解其中味。