从渲染流程上分,Skia可分为如下三个层级:

  1. 指令层:SkPicture、SkDeferredCanvas->SkCanvas。 这一层决定需要执行哪些绘图操作,绘图操作的预变换矩阵,当前裁剪区域,绘图操作产生在哪些layer上,Layer的生成与合并。
  2. 解析层:SkBitmapDevice->SkDraw->SkScan、SkDraw1Glyph::Proc。 这一层决定绘制方式,完成坐标变换,解析出需要绘制的形体(点/线/规整矩形)并做好抗锯齿处理,进行相关资源解析并设置好Shader。
  3. 渲染层:SkBlitter->SkBlitRow::Proc、SkShader::shadeSpan。 这一层进行采样(如果需要),产生实际的绘制效果,完成颜色格式适配,进行透明度混合和抖动处理(如果需要)。

SKIA渲染

渲染框架设计思想分析:

  1. 指令层与实现层分离:SkCanvas不直接执行渲染,由SkBaseDevice根据设备类型,选择渲染方法。这样虽然是同一套API,但可以用作GPU绘图、pdf绘制、存储显示列表等各种功能。在API集上做优化,避免冗余绘制,也因此成为可能(注:这个google虽然在尝试,但目前看来没有明显效果,实现起来确实也很困难)。
  2. 图=形+色的设计思想:由SkDraw和SkScan类中控制绘制的形,由SkBlitter和SkShader控制绘制的色,将绘图操作分解为形状与色彩两部分,这一点和OpenGL的顶点变换——光栅——片断着色管线相似,非常有利于扩展,各种2D图元的绘制基本上就完全支持了。
  3. 性能调优集中化:将耗时的函数抽象都抽象为proc,由一个工厂制造,便于集中对这一系列函数做优化。