一、捋清View、WindowState、Surface的关系
这部分牵扯到的是视图绘制渲染架构。
这里主要分三部分:
1)添加Window(WMS与应用层通信)
ViewRootImpl.setView()方法会向WMS请求添加一个Window,mWindowSession.addToDisplay()跨进程最终调用到了WMS.addWindow(): 这里会创建WindowState,它是WMS中描述应用程序窗口的对象。
2)与SurfaceFlinger建立连接(WMS与SurfaceFlinger通信)
WMS.addWindow()中WindowState通过attach方法建立建立一个SurfaceSession走windowAddedLocked()流程与SurfaceFlinger进行连接:
ComPoserService作为client 与 SurfaceFlinger server进行binder IPC , 获取到SurfaceFlinger创建的Client对象,它相当于是SurfaceFlinger内部对应用程序客户端的封装对象,而Client与SurfaceComposerClient又互为binder ipc的两端,SurfaceComposerClient为client端,Client为server端。
3)创建Surface(WMS分别与应用程序和SurfaceFlinger通信)
Surface是真正UI视图的载体和处理者。
ViewRootImpl内会new一个Surface,ViewRootImpl 、WindowState与Surface是一一对应关系。
创建Surface主要走的是ViewRootImpl setView操作的requestLayout流程中的relayoutWindow部分:
这个过程实际上就是在SurfaceFlinger创建Layer,对应在客户端通过SurfaceControl在native层创建Surface并copyForm返回给ViewRootImpl内java层的Surface,为什么这么麻烦?因为Surface主要负责调用绘制引擎执行渲染视图的操作,这部分工作在native效果更高。并且Android4.0之后的硬件加速绘制,渲染过程是又native进程RenderThread来负责的。
三者关系是:
View
是视图的素材;
WindowState
是窗口实体对象,WMS会通过z-order计算来决定窗口的层级关系,为SurfaceFlinger合成Layer提供层级依据。
Surface
是View的载体和处理者。它会调用绘制引擎处理View,然后申请一块buffer,存入绘制素材,传递给SurfaceFlinger。
具体可以参考之前图形系统文章:
Android图形系统(五)-Surface图形系统概览
Android图形系统(六)-app与SurfaceFlinger服务连接过程
Android图形系统(七)-app请求SurfaceFlinger创建Surface过程
Android图形系统(八)-app与SurfaceFlinger共享UI元数据过程
Android图形系统(九)-View、Canvas与Surface的关系
Android图形系统(十)-SurfaceFlinger启动及图层合成送显过程
二、视图绘制的整体流程
梳理ViewRootImpl#scheduleTraversals( )流程,主要参与的有如下几个模块:
HwComposer: 产生vsync信号
周期性唤醒DipsSyncThread产生虚拟化Vsync信号,EventThread负责请求和分发vsync信号分别到app与surfaceFlinger。
UIThread: 绘制
通过Choreographer请求vsync信号,接收信号执行doFrame,走绘制流程,初始化RenderThread并最终draw出DisplayList。
RenderThread: 渲染
同步DisplayList数据;dequeueBuffer;渲染数据并保存到buffer;queueBuffer同时更新Layer并触发invalidate-sf-vsync请求。
SurfaceFlinger: 合成送显
INVALIDATE:接收invalidate-sf-vsync请求,acquireBuffer更新脏区域、发送refresh-sf-vsync请求。
REFRESH:接收refresh-sf-vsync请求,按z-order计算可见区域,合成视图并做栅格化处理,通过FrameBuffer送显。
最后总结一张手绘的整体流程图:
视图绘制整体流程图具体可以参考之前图形系统文章:
Android图形系统(十一)-Choreographer
Android图形系统(十三)-Vsync信号处理
Android9.0 硬件加速(二)-RenderThread线程的启动
Android9.0 硬件加速(三)-绑定Surface到RenderThread
Android9.0 硬件加速(四)-UI Thread绘制过程
Android9.0 硬件加速(五) -RenderThread渲染过程
从systrace看app冷启动过程(三)-首帧的合成与送显
网友评论