Android 显示原理

1:Android显示原理

Android应用程序的显示过程包含了两个部分(应用侧绘制、系统侧渲染)、两个机制(进程间通讯机制、显示刷新机制)

1.1:基本概念

SurfaceFlinger:Android系统服务,负责管理Android系统的帧缓冲区,即显示屏幕。

Surface:可以理解为Android应用程序的一个窗口。

1.2:  应用侧

渲染过程可以分为测量、布局和绘制三个阶段。

测量:各个子UI元素的大小onMeasure

布局:各个子UI元素在父UI元素里面的位置

绘制:在画布canvas上绘制应用程序窗口所有的视图,分为基于软件的绘制模型(CPU)和硬件加速的绘制模型(GPU)onDraw

1.3:  系统侧

    Android应用程序在图形缓冲区中绘制好View层次结构后,这个图形缓冲区会被交给SurfaceFlinger服务,而SurfaceFlinger服务再使用OpenGL图形库API来将这个图形缓冲区渲染到硬件帧缓冲区中。

1.4:  进程间通讯机制

    Android应用程序为了能够将自己的UI绘制在系统的帧缓冲区上,它们就必须要与SurfaceFlinger服务进行通信。


Android应用程序与SurfaceFlinger服务是运行在不同的进程中的,因此,它们采用某种进程间通信机制来进行通信。由于Android应用程序在通知SurfaceFlinger服务来绘制自己的UI的时候,需要将UI数据传递给SurfaceFlinger服务,例如,要绘制UI的区域、位置等信息。一个Android应用程序可能会有很多个窗口,而每一个窗口都有自己的UI数据,因此, 这里用到了SharedClient

 

在每个SharedClient中,最多有31个SharedBufferStack,每个SharedBufferStack都对应一个Surface,即一个窗口。这样,我们就可以知道为什么每一个SharedClient里面包含的是一系列SharedBufferStack而不是单个SharedBufferStack:一个SharedClient对应一个Android应用程序,而一个Android应用程序可能包含有多个窗口,即Surface。从这里也可以看出,一个Android应用程序至多可以包含31个窗口。

每个SharedBufferStack中又包含了N个缓冲区(<4.1N=2; >=4.1 N=3),即显示刷新机制中即将提到的双缓冲和三重缓冲技术。

1.5:  显示刷新机制

双缓冲意味着要使用两个缓冲区(SharedBufferStack中),其中一个称为FrontBuffer,另外一个称为BackBuffer。UI总是先在Back Buffer中绘制,然后再和FrontBuffer交换,渲染到显示设备中。理想情况下,这样一个刷新会在16ms内完成(60FPS)


第一帧被画了两次(Jank),CPU/GPU没有及时处理第2帧数据?原因很简单,CPU可能是在忙别的事情,不知道该到处理UI绘制的时间了,所以又用到了中断机制:

每收到VSYNC中断,CPU就开始处理各帧数据,这样就可以顺滑的运行了。


 

一句话总结:Android应用程序调用SurfaceFlinger服务把经过测量、布局和绘制后的Surface渲染到显示屏幕上。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值