Skia 跨平台2D图形库,有软\硬两种模式, 39W行代码(src+include),SO大小7.1M,作为Chrome\Android\Flutter\鸿蒙OS的 2D渲染引擎 。 W3CCanvasContext2D的能力算Skia的子集。
下文主要是入门的分享。以PPT+解释的方式进行,未解释到的请大家留言。内容涉及
- 渲染相关组件 以及 Android渲染内存成分的对比图。
- Skia GPU Draw Pipeline、SkPaint、SKSL、SkRuntimeEffect。
- Skottie特效、SkottieAE表达式实现
- 不涉及 drawXX具体实现、Op的合并算法 、路径三角化算法、抗锯齿算法、性能优化等。
第4步准备数据。第5\6步准备glPipeline drawXX转为GrOp前要把资源转为Gr资源(有别于软渲染)、抗锯齿算法等 GrOp内包含了 根据VertexSpec生成顶点数据、三角形生成算法、基于SKSL拼接(emitCode)shader并运行时转为GLSL构建glProgram image.png SkPaint很重要,画笔除了日常理解的 彩笔,还有图章。比如用执行 drawPaint()就相当于盖了个图章。 也可以转一圈的盖,就是patterns了。 SKSL是skia的精华,不同于GrGPU抹平的是平台差异,SKSL抹平的是各平台ShaderLanguage差异。 从图中左右两边的对比可以看出, 1. 行数变少了 2. 函数个数有差异 3. 代码有优化。 image.png
四 Skottie
这里需要先解下Lottie,Skottie是Lottie的在Skia上的实现。这里主要介绍
- Skottie Pipeline
- 借助SkRuntimeEffect新增特效
a. 原理是通过SkPaint插入自定义的SKSL,作用于FragmentShader。 - 利用SKSL解释器完成AE表达式的执行。
image.png
image.png
image.png
配合Skia官方的例子和以上介绍,算是入门。这个过程还做了Skia包体积的裁剪,主要停留在编译优化、依赖库最小化、合并so提高无用method移除最大化,源码层面进展少,主要思路是 针对CPU\GPU各自的应用场景,裁剪掉场景内不需要的特性。依托Skia能干事情还有很多。欢迎大家留言。
网友评论