带你读《2022技术人的百宝黑皮书》——Flutter 新一代图形渲染器 Impeller(4)https://developer.aliyun.com/article/1340788?groupCode=taobaotech
solid_fill.vert.mm 文件仅对相应结构体进行填充和对齐校验,无实际功能。
对于solid_fill.frag 同样的处理逻辑,生成了solid_fill.frag.metal,solid_fill.frag.h和solid_fill.frag.mm文件。
Shader binding文件包含了着色器所有描述信息,如入口点,输入/输出结构,以及对应的buffer slot。运行时根据shader binding可以快速生成为pipeline state objects。另外,bindings中输入/输出结构是有填充和对齐的,所以顶点和uniform数据可以直接内存映射。
Impeller渲染流程
impeller通过分别继承了IOSContext、IOSSurface和flowSurface,实现了IOSContextMetalImpeller、 IOSSurfaceMetalImpeller和GPUSurfaceMetalImpeller结构对接到了flutter flow子系统中。在光栅化阶段,通过DisplayListCanvasRecorder(继承自SkNoDrawCanvas并实现了所有SkCanvas的函数)合成Layer Tree,把所有layer中的绘图命令转换为一个个的DLOps,并存储到DisplayList结构。DLOps中存储了绘图的所有数据信息,如常见的AnitiAliasOp,SetColorOp,DrawRectOp等,共有73种Ops。
如下为drawRect的DrawRectOp的结构:
struct DrawRectOp final : DLOp { static const auto kType = DisplayListOpType::kDrawRect; explicit DrawRectOp(SkRect rect) : rect(rect) {} const SkRect rect; void dispatch(Dispatcher& dispatcher) const { dispatcher.drawRect(rect); }
带你读《2022技术人的百宝黑皮书》——Flutter 新一代图形渲染器 Impeller(6)https://developer.aliyun.com/article/1340785?groupCode=taobaotech