Android Framework: UI绘制过程的总结

概览

Android 应用UI显示的全过程分为三个步骤

  1. 数据加载
  2. 帧率控制
  3. 图像渲染

详细实现

数据加载

1. 解析清单文件

系统开机后启动PMS服务,来解析各个App的清单文件,并登记到AMS中。

2. 启动用户进程

过程种会有4个进程通信:Launcher、AMS、Zygote进程、待启动的进程。

  1. Launcher 进程通过 IPC 请求AMS启动一个Activity组件。
  2. 如果目标进程没有启动,Ams通知Zygote进程fork一个新进程。
  3. AMS通知Launcher Pause。
  4. AMS开始启动新的Activity,其内部通过Handler通信通知新进程去绘制界面。

3. 启动Activity

Handler中会分别回调Activity的onAttached
OnCreate
为Activity创建一个PhoneWindow

4. 构建View

  1. 合成DecorView。setContentView中解析原始的布局文件。把contentView添加到DecorView里面

  2. 在OnResume中,把View添加到WM中。将View添加到WindowManager中。会执行代码wm.addView(view)
    内部创建ViewRootImpl。它扮演View绘制的管理者,绘制View时,会创建一个包含GraphicBufferProducer句柄的Surface。 本质上是Surface与SurfaceFingler之间通过GBP来交换buffer。绘制View的数据会存到Buffer上,Surface通过binder的形式与系统服务通信。

  3. ViewRootImpl与windowManager交互时序图如下在Sest这里插入图片描述

帧率控制

上面我们总结了View数据的生成,那么我们还需要把View显示到屏幕上。屏幕显示主要由屏幕刷新率GPU渲染速率相互作用。
GPU性能决定了每秒能产生多少图像数据。作为生产者。
屏幕刷新率(60HZ)决定每秒能显示多少图像画面。作为消费者。

其中我们开发者能控制的是GPU渲染图像的帧率。

  • 帧率过大,可发生跳帧。
  • 帧率过小,可发生画面断裂。

一般会因为帧率过小会导致用户感觉到画面有延迟感(白屏)。
根本原因:CPU负载过高/ UI线程得不到及时调度/ 主线程进行的耗时操作,以渲染图像。
白屏的原因:屏幕刷新率高于帧率,没有数据提供给屏幕刷新,所以屏幕显示白色或黑色。

流畅度优化

系统进一步采用Vsync和Choreography对帧率进行控制。

vsync
  • 手动把帧率控制在60fps ,并采用双缓冲。
    如果是游戏设备这个帧率可能在144MHZ。
Choreography
  • 管理垂直同步vsync

图像渲染

Surface可以lock一个 Canvas,然后再Canvas上添加图像数据。生成的Surface存入WMS的队列中。
编舞者收到垂直信号会让SurfaceFlinger从帧缓存中读出来 ,交给底层skia库或者opengl去渲染。

总结

AndroidUI的显示, 围绕数据的生成和数据的消费两个部分展开。
其中数据的产生:包括进程启动,布局文件解析,window的创建,视图的添加。
而数据的消费:包括帧率和频率刷新率的同步,底层SurfaceFingler读取数据,最终交给OpenGL去渲染到屏幕上。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值