theme: fancy
大致链路
UIView/CALayer---->CoreAnimation./Core Graphics/Core Image---->GPU Drive-->GPU
图层树/视图树
一个UIView(视图)对应一个CALayer(图层),CALayer对应显示的数据其有个content代表Bitamp,渲染流程后的Bitmap被存储在content属性中(这个bitmpa也叫back store)UIView代表视图树对应的CALayer对应图层树
分离UIView和CALayer的目的在于:职责分离,可移植到MAC os上处理。对应于不同的交互UIView(负责响应用户交互,管理视图用于显示正确的图层树)是不同的,而CALayer(图层树)只负责提供Bitmap用于CoreAnimation框架读取组合,CoreAnimation框架可以复用
Core框架处理(组合)
CoreAnimation用于快速组合不同的CALayerr来显示到屏幕上 CoreGraphics用于实时计算,运行时绘制图像的核心图像库,
CoreImage,图像处理分析框架,对已经存在的图像进行处理。运行前处理图像
OPENGL
直接与GPU交互,由GPU的显卡提供商提供,用于2D3D图形渲染。
GPUDrive
链接到GPU
CALayer的content属性
主要职责:提供Bitmap用于CoreAnimatin框架组合显示 纹理就是一个2D图片 该content属性指向一块缓冲区(backing store)就是一个Bitmap纹理。该缓冲区保存的图片叫做寄宿图。
渲染流程基于顶点,基于纹理(直接提供图片):
1.使用图片纹理:contents属性配置
数据类型为id而不是CGImage是为了适配MAC OS系统,MAC OS系统中定义CFImage和NSImage都起作用
2.自己基于顶点来处理数据,手动绘制
顶点的需要自己计算纹理,光照信息用于片段主色器显示颜色
UIView中有一个drawRect方法用于实现自定义绘制,由Core Graphics处理绘制寄宿图, 实现原理:drawRect是CALayer的方法,CALayer中有一个delegete代理的属性,UIView实现了这个代理的协议,因此CALayer请求代理(UIView)得到数据,代理可以设置CALayer的寄宿图content属性
IOS渲染流水线:
各个框架都介绍了提供的数据及处理数据的方式 CoreAnimation用于组合不同的CALayer进行显示
用户更新界面
APP响应用户操作,更新视图树流程:(Application阶段,生成图元信息) 类似于Android的绘制流程 measure,layout,draw
IOS: layout,display,prepare,commit
layout(构建视图)
:添加子视图,调用layoutSubviews,计算视图布局 注意:减少视图层级,视图创建
Display(绘制视图)
Core Grphics进行视图绘制,得到图元信息(对比与Android的canvas在Surface中的内存信息)
prepare(CoreAnimation处理额外的图像解码和转换)
commit(打包发送图元信息):递归将图层信息发送到RenderServer进程,视图树层级越深,效率越低
参考文章:http://chuquan.me/2018/08/26/graphics-rending-principle-gpu/