绘制简介
Android中使用OpenGL以及 Skia Vulkan来进行跨平台的绘制. 通过客户端进程、SystemServer、SurfaceFlinger三个进程的配合来完成Android系统上的绘制工作.更多教程请访问码农之家
流程简介
阶段1 – 系统初始化
完成显示相关的设备驱动的初始化 :
- 在系统启动的时候 ,
init.rc
中会启动SystemServer
- 在
system_server
进程中初始化WindowManagerService
, 以及启动SurfaceFlinger
进程 , - 在
SurfaceFlinger
中初始化Gralloc
以及FrameBuffer
设备驱动
阶段2 – 建立连接
在窗口(如Activity
、Dialog
、PopupWindow
、悬浮窗等)需要被显示到屏幕上时 :
- 在本进程创建一个
PhoneWindow
, 并且创建空的Surface
(后面会将Surface
进行填充) - 通过
Session
通知WindowManagerService
创建WindowState
代表窗口 - 按排序将
WindowState
窗口添加到列表中 - 建立起
WindowManagerService
与SurfaceFlinger
之间的桥梁SurfaceComposerClient
.
阶段3 – 填充Surface
在进程收到Vsync
信号之后 :
- 窗口端向
WindowManagerService
申请填充Surface
WindowManagerService
会向SurfaceFlinger
创建Layer
(其中包括BufferQueue
、IGraphicBufferConsumer
、IGraphicBufferProducer
)以及对应的内存空间- 将
Layer
添加到Z-Order
排序的列表中 - 将该内存空间的信息、
Layer
信息返回给WindowManagerService
WindowManagerService
将该信息返回给窗口端的Surface
阶段4 – 开始绘制
在Surface
填充完后 , 开始绘制工作 :
- 通过
performTravels
开始在Surface上进行绘制 - 当调用
lockCanvas
来通过IGraphicBufferProducer.dequeueBuffer
来申请用来绘制的GraphicBuffer
, - 通过
unlockAndPostCanvas
调用IGraphicBufferProducer.queueBuffer
来向SurfaceFlinger的消费者发送Buffer
阶段5 – 显示屏显示
在SurfaceFlinger端 :
- 接收到生产者发送的Buffer后 , 会调用
FrameBuffer
驱动的方法 - 将生产者传输的Buffer通过
fb_memset
将内存复制到驱动空间 - 通过电子枪逐行扫描像素进行显示
关系图
image.png
核心类介绍
绘制相关的核心类主要包括三个进程中的类 .
应用进程
ActivityThread
: 通过ApplicationThread
接收AMS的消息 , 回调Activity
生命周期 ViewRootImpl
: 管理IWindowSession
以及RootView IWindowSession
: 负责与WMS通信 , 并且通过AIDL填充Surface PhoneWindow
: 负责Activity的DecorView
的inflate操作
SystemServer进程
WindowManagerService
: 负责将Activity与Window进行绑定 , 管理所有窗口 WindowState
: 每一个WindowState代表一个客户端窗口 , 并且保存与客户端窗口通信的IBinder Session
: 用于保持与客户端的IBinder连接 SurfaceSession
: SurfaceComposerClient
的Java层代理 SurfaceComposerClient
: SurfaceFlinger与Client在WMS中的代理 ComposerService
: SurfaceFlinger在ServiceManager中注册的Service WindowStateAnimator
: 负责Window的动画 IGraphicBufferProducer
: SurfaceFlinger中BufferQueueProducer的代理对象
SurfaceFlinger进程
SurfaceFlinger
: 负责与WMS进行 Client
: 每个窗口都会对应一个Client Layer
: 每一个窗口对应的Layer BufferQueue
: 绘制缓冲队列 , 向每个Surface提供绘制的Buffer BufferQueueProducer
: 绘制缓冲队列的生产者 , SurfaceFlinger提供给客户进程 BufferQueueConsumer
: 绘制缓冲队列的消费者 , 用于接收客户端发送的Buffer
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/276080.html