赞
踩
Android 应用UI显示的全过程分为三个步骤
系统开机后启动PMS服务,来解析各个App的清单文件,并登记到AMS中。
过程种会有4个进程通信:Launcher、AMS、Zygote进程、待启动的进程。
Handler中会分别回调Activity的onAttached
OnCreate
为Activity创建一个PhoneWindow
合成DecorView。setContentView中解析原始的布局文件。把contentView添加到DecorView里面
在OnResume中,把View添加到WM中。将View添加到WindowManager中。会执行代码wm.addView(view)。
内部创建ViewRootImpl。它扮演View绘制的管理者,绘制View时,会创建一个包含GraphicBufferProducer句柄的Surface。 本质上是Surface与SurfaceFingler之间通过GBP来交换buffer。绘制View的数据会存到Buffer上,Surface通过binder的形式与系统服务通信。
ViewRootImpl与windowManager交互时序图如下
上面我们总结了View数据的生成,那么我们还需要把View显示到屏幕上。屏幕显示主要由屏幕刷新率和GPU渲染速率相互作用。
GPU性能决定了每秒能产生多少图像数据。作为生产者。
屏幕刷新率(60HZ)决定每秒能显示多少图像画面。作为消费者。
其中我们开发者能控制的是GPU渲染图像的帧率。
一般会因为帧率过小会导致用户感觉到画面有延迟感(白屏)。
根本原因:CPU负载过高/ UI线程得不到及时调度/ 主线程进行的耗时操作,以渲染图像。
白屏的原因:屏幕刷新率高于帧率,没有数据提供给屏幕刷新,所以屏幕显示白色或黑色。
系统进一步采用Vsync和Choreography对帧率进行控制。
Surface可以lock一个 Canvas,然后再Canvas上添加图像数据。生成的Surface存入WMS的队列中。
编舞者收到垂直信号会让SurfaceFlinger从帧缓存中读出来 ,交给底层skia库或者opengl去渲染。
AndroidUI的显示, 围绕数据的生成和数据的消费两个部分展开。
其中数据的产生:包括进程启动,布局文件解析,window的创建,视图的添加。
而数据的消费:包括帧率和频率刷新率的同步,底层SurfaceFingler读取数据,最终交给OpenGL去渲染到屏幕上。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。