theme: fancy
先来回顾一下Android的渲染史:
Android的渲染史:
Android4.0之前绘制是在主线程执行的,4.0之后除了引入Vsync和双缓冲还引入了单独处理绘制的RenderServer线程。在draw中保存记录绘制指令,稍后RenderServer会取出绘制指令进行调用GPU绘制,填充到Surface的缓冲区中,WindowManager将所有的Surface提供到缓冲区中,SurfaceFliger取出缓冲区的数据进行合成图层操作,合成策略会借鉴于HWComposer模块一起处理,HWComposer再将处理好的数据给到frameBuffer,Display取展示到屏幕。
RenderServer在IOS中是单独的进程去处理,在Android中RenderServer线程去处理绘制操作,只不过该线程是FM层维护的
同步至RenderServer进程
将CALayer的content数据打包通过IPC提交到RenderServer进程,RenderServer进行调用CoreAnimation框架进行处理阴影等信息:
RenderServer流程:
解析发送过来的图层信息包,里面包含图元信息。
调用OPGL生成图像将处理后的数据提交到GPU的command Buffer缓冲区中(最主要的工作)
GPU从command Buffer缓冲区中读取数据,进行处理图元信息
处理图元信息流程:
- Triler对应于顶点处理器,给图元添加基本信息:光照,纹理等信息
- 平铺:将图元转换为Vertex,链接Vertex,生成额外的Vertex用于生成更复杂的几何图形 ,并进行光栅化处理(生成像素跨国像素中心点的才是有效像素),并将像素信息提交到Parameter Buffer中
- Tiler更新完像素信息,Parameter 缓冲区满自后,将像素处理转换为Bitmap(处理像素,生成Bitmap)。 这个里面会进行片段着色器等处理,对片段进行着色(计算图元的光照纹理信息...)....
- 混合裁剪:减少不必要的渲染,对透明度等进行混合/......
- 将处理后的数据放到renderBuffer缓冲区中【猜测是三缓冲的第三个缓冲区】
交换缓冲区
等待Vsync信号置换renderBuffer和BackBuffer的数据,BackBuffer和frameBuffer的数据,Display取出frameBuffer进行渲染