Android系统显示原理

应用层

Android显示过程的概括:Android应用程序把经过测量、布局、绘制后的surface缓存数据,通过SurfaceFlinger把数据渲染到显示屏幕上,通过Android的刷新机制来刷新数据。也就是说应用层负责绘制,系统层负责渲染,通过进程间通信把应用层需要绘制的数据传递到系统层服务,系统层服务通过刷新机制把数据更新到屏幕。

绘制原理中每个View绘制的三个步骤中Measure和Layout都是递归来获取View的大小和位置,层级越深,元素越多,耗时也就越长。

1.Measure
用深度优先规则递归得到所有试图(View)的宽、高;获取当前View的宽度childWidthMeasureSpec和高度childHeightMeasureSpec之后,
可以调用它的成员函数Measure来设置它的大小。如果当前正在测量的子视图child是一个视图容器,那么它又会重复执行操作,
直到它的所有子孙视图的大小都测量完成为止

2.Layout
用深度优先原则递归得到所有View的位置;当一个子View在应用程序窗口左上角的位置确定之后,再结合它在前边测量过程中确定的宽度和高度,就可以完全确定它在应用程序窗口中的布局。

3.Draw
目前Android有两种绘制方式,软件绘制CPU与硬件加速GPU,GPU的显示和绘制效率远高于CPU,但也有缺点:耗电,兼容问题,内存大(使用openGL的接口至少需要8MB内存)

系统层

真正把需要显示的数据渲染到屏幕上,通过SufaceFlinger服务实现的

简单过程

1.响应客户端事件,创建Layer与客户端的Surface建立连接

2.接受客户端数据与属性,修改Layer属性,比如尺寸、颜色、透明度等

3.将创建的Layer内容刷新到屏幕上

4.维持Layer序列,并对Layer最终输出做出裁剪计算

在Android的显示系统,使用了Android的匿名共享内存:SharedClient,每一个应用和SurfaceFlinger之间都会创建一个SharedClient,每个SharedClient中最多创建31哥SharedBufferStack,每个Surface都对应一个SharedBufferStack,也就是一个window。同时每个SharedBufferStack又包含了两个或三个缓冲区,surfaceFlinger在驱动层把缓冲区中的数据渲染到屏幕。

FPS

这个表示每秒传递的帧数,老生常谈16ms发一次VSYNC信号,触发UI渲染,这就是60FPS,超了就会丢帧感到卡顿不流畅,可能是Layout太复杂了,也可能是UI上有太多的绘制单元,还可能是动画执行的次数太多

卡顿的根本原因

主要就是两个方面

1.绘制任务太重,绘制一帧的内容耗时太长
2.主线程太忙,导致VSYNC信号来的时候还没准备好数据导致丢帧

主线程主要干的工作

1.UI生命周期控制
2.系统事件处理
3.消息处理
4.界面布局
5.界面绘制
6.界面刷新
除了这些之外,其他活尽量避免让主线程去干

原文地址:https://www.cnblogs.com/yinyulong/p/12702272.html

时间: 2024-10-13 01:28:33

Android系统显示原理的相关文章

Android系统显示框架

1 Linux 驱动   FrameBuffer 在内核层,系统屏幕是使用一个称为帧缓冲区的硬件设备来描述的,而用户空间的应用程序可以通过设备文件/dev/fb0或者/dev/graphics /fb0来操作这个硬件设备.实际上,帧缓冲区本身并不是一个真正的硬件,它只不过是对显卡的一个抽象表示,不过,我们通过访帧缓冲区就可以间接地操作显 卡内存以及显卡中的其它寄存器 2 硬件抽象层(HAL)模块Gralloc 为了在屏幕中绘制一个指定的画面,我们需要: 1.  分配一个匹配屏幕大小的图形缓冲区

Android 显示原理简介

转:http://djt.qq.com/article/view/987 作者:yearzhu,2011年进入腾讯公司,从事过Web端及移动端的测试工作,喜爱新鲜事物及新技术,目前在SNG开放平台测试组负责的移动互联SDK的测试工作. 现在越来越多的应用开始重视流畅度方面的测试,了解Android应用程序是如何在屏幕上显示的则是基础中的基础,就让我们一起看看小小屏幕中大大的学问.这也是我下篇文章——<Android应用流畅度测试分析>的基础. 首先,用一句话来概括一下Android应用程序显示

(转载)Android显示原理简介

Android应用程序显示的过程:Android应用程序调用SurfaceFlinger服务把经过测量.布局和绘制后的Surface渲染到显示屏幕上. 名词解释 SurfaceFlinger:Android系统服务,负责管理Android系统的帧缓冲区,即显示屏幕. Surface:Android应用的每个窗口对应一个画布(Canvas),即Surface,可以理解为Android应用程序的一个窗口. Android应用程序的显示过程包含了两个部分(应用侧绘制.系统侧渲染).两个机制(进程间通讯

【转】Android 显示原理简介

作者:yearzhu,2011年进入腾讯公司,从事过Web端及移动端的测试工作,喜爱新鲜事物及新技术,目前在SNG开放平台测试组负责的移动互联SDK的测试工作. 原文链接 现在越来越多的应用开始重视流畅度方面的测试,了解Android应用程序是如何在屏幕上显示的则是基础中的基础,就让我们一起看看小小屏幕中大大的学问.这也是我下篇文章——<Android应用流畅度测试分析>的基础. 首先,用一句话来概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlinger服

[转]安卓显示原理介绍

转自:http://djt.qq.com/article/view/987 作者:yearzhu,2011年进入腾讯公司,从事过Web端及移动端的测试工作,喜爱新鲜事物及新技术,目前在SNG开放平台测试组负责的移动互联SDK的测试工作. 现在越来越多的应用开始重视流畅度方面的测试,了解Android应用程序是如何在屏幕上显示的则是基础中的基础,就让我们一起看看小小屏幕中大大的学问.这也是我下篇文章——<Android应用流畅度测试分析>的基础. 首先,用一句话来概括一下Android应用程序显

Android系统Recovery工作原理之使用update.zip升级过程分析(六)---Recovery服务流程细节【转】

本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465439  Android系统Recovery工作原理之使用update.zip升级过程分析(六)---Recovery服务流程细节            Recovery服务毫无疑问是Recovery启动模式中最核心的部分.它完成Recovery模式所有的工作.Recovery程序对应的源码文件位于:/gingerbread0919/bootable/recovery/recovery

Android系统 应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示

参考: http://dev.xiaomi.com/doc/p=3904/index.html http://my.oschina.net/ososchina/blog/352286?p=1#comments https://github.com/leolin310148/ShortcutBadger http://www.voidcn.com/blog/kongbaidepao/article/p-62251.html http://www.eoeandroid.com/thread-5572

Android系统Recovery工作原理之使用update.zip升级过程---updater-script脚本语法简介以及执行流程(转)

目前update-script脚本格式是edify,其与amend有何区别,暂不讨论,我们只分析其中主要的语法,以及脚本的流程控制. 一.update-script脚本语法简介: 我们顺着所生成的脚本来看其中主要涉及的语法. 1.assert(condition):如果condition参数的计算结果为False,则停止脚本执行,否则继续执行脚本. 2.show_progress(frac,sec):frac表示进度完成的数值,sec表示整个过程的总秒数.主要用与显示UI上的进度条. 3.for

android系统平台显示驱动开发简要:LCD基本原理篇『一』

平台信息:内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博客:http://weibo.com/cpjphone 从在校时玩单片机的点阵屏,到工作后android系统下的LCD,他们像一条流水线,顺应,简单的原理构成了复杂的结构: 我们来梳理一下: 玩51用的点阵 玩51用的lcd1602 玩51.32用的TFT彩屏 对于点阵的原理相比大多数朋友都非常熟悉,