Android系统显示原理

核能气质少年 提交于 2019-12-18 05:13:17

一.Android系统显示原理

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

通过阅读Android系统的源码可以了解显示的流程,Android的图形显示系统采用的是client/server架构。SurfaceFlinger(server)由C++代码编写。Client端代码分为两部分,一部分是由java提供给应用使用的API,另一部分是由C++写成的底层具体实现。

 

二.绘制原理

     绘制任务是由应用层发起的,最终通过系统层绘制到硬件屏幕上显示的。

       1.应用层:

             

                                                     图1.1

如上图,这是一个UI界面,有很多不同层次的基本元素(view)构成,整体是一个树形结构,不同的镶嵌,存在不同的父子关系,这是一个递归的渲染过程。在Android 中,iew绘制有三个核心的步骤,,如图1.2,通过measure来绘制view的大小,通过layout确定view的位置,最后通过draw绘制到surface,在Android源码中,viewRootImp类的performTraversals()方法中,可以看出measure和layout都是递归来获取view的大小和位置,并且以深度作为优先级,可以看出,层级越深,元素越多,耗时也就越长。

            图1.2

2.系统层:

       真正把需要显示的数据渲染在屏幕上,是通过系统级进程中的surfaceFlinger服务来实现的,surfaceFlinger的具体实现和工作原理和应用层关系不大,不做介绍,只需要了解主要做些什么工作:

  1. 响应客户端事件,创建layer与客户端的surface建立连接
  2. 接受客户端数据及属性,修改layer属性:如尺寸,颜色,透明度等等。
  3. 将创建的layer内容刷新到屏幕上。
  4. 维持layer的序列,并对layer最终输出做出裁剪计算。

既然是两个不同进程,就需要一个跨进程的通信机制来实现数据传输,在Android的显示系统,使用了Android的匿名共享内存:sharedClient,每一个应用和surfaceFlinger之间都会创建一个sharedClient,如图1.3,在每一个sharedClient中,最多可以创建31个sharedBufferStack,每个surface都对应一个sharedBufferStack,也就是一个window。

 

图1.3

      

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!