2022-06-17 Skia&Skottie入门

2022-06-17  本文已影响0人  SMSM

Skia 跨平台2D图形库,有软\硬两种模式, 39W行代码(src+include),SO大小7.1M,作为Chrome\Android\Flutter\鸿蒙OS的 2D渲染引擎 。 W3CCanvasContext2D的能力算Skia的子集。
下文主要是入门的分享。以PPT+解释的方式进行,未解释到的请大家留言。内容涉及

  1. 渲染相关组件 以及 Android渲染内存成分的对比图。
  2. Skia GPU Draw Pipeline、SkPaint、SKSL、SkRuntimeEffect。
  3. Skottie特效、SkottieAE表达式实现
  4. 不涉及 drawXX具体实现、Op的合并算法 、路径三角化算法、抗锯齿算法、性能优化等。
1. 用的全屏模式BufferSize是 1440*2712 。GL环境未开启 stencil、depth , colorbuffer格式是RGBA 8888。 所以一个GraphicBuffer的占用是 1440*2712*4 = 15.6MB。 2. 内存优化的话,主要从多view复用buffer减少个数、减少buffer尺寸两个维度入手。 UI组件和裸的OpenGL流程最大的不同是,组件侧维护了虚拟DomTree用于局部更新。但最终的元产物都是三角形。 SkSurface决定软or硬。 GrGpu抹平的不同的Graphic平台。drawxx最终生成GrOp , 符合生产消费模型。
第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上的实现。这里主要介绍

  1. Skottie Pipeline
  2. 借助SkRuntimeEffect新增特效
    a. 原理是通过SkPaint插入自定义的SKSL,作用于FragmentShader。
  3. 利用SKSL解释器完成AE表达式的执行。
image.png
image.png
image.png
image.png

配合Skia官方的例子和以上介绍,算是入门。这个过程还做了Skia包体积的裁剪,主要停留在编译优化、依赖库最小化、合并so提高无用method移除最大化,源码层面进展少,主要思路是 针对CPU\GPU各自的应用场景,裁剪掉场景内不需要的特性。依托Skia能干事情还有很多。欢迎大家留言。

上一篇 下一篇

猜你喜欢

热点阅读