-
想问一下作者,与其花大力气去实现tgfx的各种绘图算法,为什么不直接用操作系统提供的绘图库呢?像directx,metal这些。 我不是很懂,希望作者能解惑。 |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 3 replies
-
是因为你没理解 Skia 是做什么的,也理解错了OpenGL, DirectX, Metal, 和Vulkan这些接口的功能层级,它们只提供最底层的 GPU 接口,需要你写 Shader 才能绘制各种基本效果。它们并不直接能画任何 2D 图形,既不能处理矢量也不能处理文本,要2D绘图库把矢量转成顶点数据,把文本处理成栅格化的纹理或图集给这些GPU接口,硬件才能理解。更不用说还要做 DrawCall 合并和缓存等各种调用的优化。你所说的那个统一封装一层API的库叫做 bgfx,只是做跨平台 Shader 这一件事,让你可以统一的方式写 Shader 而已。跨平台 Shader 库这种轮子已经有大把了,但跟 tgfx / Skia 这种 2D 绘图引擎解决的完全不是一个层面的问题,完全也不是一个量级的复杂度。Skia 是这个领域的事实标准,几乎统治了 2D 绘图引擎近 20 年,其他方案要么不跨平台,要么没有 GPU 渲染都是纯软件的。但是 Skia 的历史包袱也非常重,近20年的迭代让它要同时兼容软件渲染和GPU渲染管线,导致无论包体还是性能都是都不能为现代 GPU 硬件专门优化到极致。所以我们才要开发纯 GPU 渲染的 tgfx 绘图引擎,做成 Skia 的最有竞争力替代品。 |
Beta Was this translation helpful? Give feedback.
我们的跨平台要支持:Windows, macOS,Linux, iOS,Android, Web(WASM),鸿蒙。你现在的假设是这列表里的每个平台里都存在一个和 Skia 对应的系统接口模块,稍微搜索一下就会知道结论是没有。不只是没有,就算有的平台有功能也缺失很多。就算功能数量接近的性能也完全被 Skia 碾压。
一个个点解释:除了 Windows 的 Direct2D,macOS 的 CoreGraphics,其他平台大部分就是直接用 Skia,并没有从系统透出接口让你可以做二次封装。比如 Android 内置的 Skia 只服务它的 UI 框架,在 Java 透出的 Canvas 接口并不能用来渲染到自定义的 OpenGL 纹理上,你最多只能用它渲染到 Bitmap 上,那只有软件渲染了,性能很差。更别说 Android Canvas 压根没有暴露出 Skia 的多少完整能力。
再以 macOS 的 CoreGraphics 为例,它只支持软件渲染,完全没有 GPU 渲染。而且它就算只和 Skia 对比纯软件渲染也比 Skia 渲染慢好几倍。而且功能上缺失大量 Skia 提供的能力,比如矢量的布尔操作,全行业的方案有且只有 Skia 做了。另外你的假设存在一个明显问题,桌面平台基本没有包体压力,所以为了减少包体在桌面平台做跨平台封装是个伪需求,封装完性能还不如 Skia。
我们的目标是要在移动端做到比 Skia 包体小,然后在所有平台做到比 Skia 性能更好,这个才是核心的价值。TGFX 目前还在高速迭代过程,但是初步的测试结果已经可以看到很不错的成果:在移动端包…