Android核心分析之二十六Android GDI之SurfaceFlinger

时间:2022-10-12 09:50:14

Android GDI之SurfaceFlinger
  SurfaceFinger按英文翻译过来就是Surface投递者。SufaceFlinger的构成并不是太复杂,复杂的是他的客户端建构。SufaceFlinger主要功能是:
  1) 将Layers (Surfaces) 内容的刷新到屏幕上
  2) 维持Layer的Zorder序列,并对Layer最终输出做出裁剪计算。
  3) 响应Client要求,创建Layer与客户端的Surface建立连接
  4) 接收Client要求,修改Layer属性(输出大小,Alpha等设定)
  但是作为投递者的实际意义,我们首先需要知道的是如何投递,投掷物,投递路线,投递目的地。
  1  SurfaceFlinger的基本组成框架
                      Android核心分析之二十六Android GDI之SurfaceFlinger

123.jpg (14.07 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:44 上传

 

  SurfaceFlinger管理对象为:
  mClientsMap:管理客户端与服务端的连接。
  ISurface,IsurfaceComposer:AIDL调用接口实例
  mLayerMap:服务端的Surface的管理对象。
  mCurrentState。layersSortedByZ :以Surface的Z-order序列排列的Layer数组。
  graphicPlane 缓冲区输出管理
  OpenGL ES:图形计算,图像合成等图形库。
  gralloc.xxx.so这是个跟平台相关的图形缓冲区管理器。
  pmem Device:提供共享内存,在这里只是在gralloc.xxx.so可见,在上层被gralloc.xxx.so抽象了。
  2 SurfaceFinger Client和服务端对象关系图
                      Android核心分析之二十六Android GDI之SurfaceFlinger

321.jpg (176.67 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:45 上传

 

  Client端与SurfaceFlinger连接图:
                       Android核心分析之二十六Android GDI之SurfaceFlinger

456.jpg (11.27 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:49 上传

 

  Client对象:一般的在客户端都是通过SurfaceComposerClient来跟SurfaceFlinger打交道。
                       Android核心分析之二十六Android GDI之SurfaceFlinger

654.jpg (25.89 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:48 上传

 

Android核心分析之二十六Android GDI之SurfaceFlinger

789.jpg (14.72 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:50 上传

 

  3 主要对象说明3.1 DisplayHardware &FrameBuffer
  首先SurfaceFlinger需要操作到屏幕,需要建立一个屏幕硬件缓冲区管理框架。Android在设计支持时,考虑多个屏幕的情况,引入了graphicPlane的概念。在SurfaceFlinger上有一个graphicPlane数组,每一个graphicPlane对象都对应一个DisplayHardware。在当前的Android(2.1)版本的设计中,系统支持一个graphicPlane,所以也就支持一个DisplayHardware。
  SurfaceFlinger,Hardware硬件缓冲区的数据结构关系图。
  Client对象:一般的在客户端都是通过SurfaceComposerClient来跟SurfaceFlinger打交道。
                   Android核心分析之二十六Android GDI之SurfaceFlinger

987.jpg (26.68 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:52 上传

 

  3.2 Layer
                   Android核心分析之二十六Android GDI之SurfaceFlinger

147.jpg (6.54 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:52 上传

 

  method:setBuffer  在SurfaceFlinger端建立显示缓冲区。这里的缓冲区是指的HW性质的,PMEM设备文件映射的内存。
  1) layer的绘制
  void Layer::onDraw(const Region& clip) const
  {
  int index = mFrontBufferIndex;
  GLuint textureName = mTextures[index]。name;
  …
  drawWithOpenGL(clip, mTextures[index]);
  }
  3.2 mCurrentState.layersSortedByZ
  以Surface的Z-order序列排列的LayerBase数组,该数组是层显示遮挡的依据。在每个层计算自己的可见区域时,从Z-order 顶层开始计算,是考虑到遮挡区域的裁减,自己之前层的可见区域就是自己的不可见区域。而绘制Layer时,则从Z-order底层开始绘制,这个考虑到透明层的叠加。
  4 SurfaceFlinger的运行框架
  我们从前面的章节的基本原理可以知道,SurfaceFlinger的运行框架存在于:threadLoop,他是SurfaceFlinger的主循环体。SurfaceFlinger在进入主体循环之前会首先运行:SurfaceFlinger::readyToRun()。
  4.1 SurfaceFlinger::readyToRun()
  (1)建立GraphicPanle
  (2)建立FrameBufferHardware(确定输出目标)
  初始化:OpenGL ES
  建立兼容的mainSurface.利用eglCreateWindowSurface。
  建立OpenGL ES进程上下文。
  建立主Surface(OpenGL ES). DisplayHardware的Init()@DisplayHardware.cpp函数对OpenGL做了初始化,并创建立主Surface。为什么叫主Surface,因为所有的Layer在绘制时,都需要先绘制在这个主Surface上,最后系统才将主Surface的内容”投掷”到真正的屏幕上。
  (3) 主Surface的绑定
  1)在DisplayHandware初始完毕后,hw.makeCurrent()将主Surface,OpenGL ES进程上下文绑定到SurfaceFlinger的上下文中,
  2)之后所有的SurfaceFlinger进程中使用EGL的所有的操作目的地都是mSurface@DisplayHardware。
  这样,在OpenGL绘制图形时,主Surface被记录在进程的上下文中,所以看不到显示的主Surfce相关参数的传递。下面是Layer-Draw,Hardware.flip的动作示意图:
                    Android核心分析之二十六Android GDI之SurfaceFlinger

741.jpg (6.85 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:54 上传

 

 4.2 ThreadLoop
                     Android核心分析之二十六Android GDI之SurfaceFlinger

258.jpg (8.84 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:54 上传

 

  (1)handleTransaction(…):主要计算每个Layer有无属性修改,如果有修改着内用需要重画。
  (2)handlePageFlip()
  computeVisibleRegions:根据Z-Order序列计算每个Layer的可见区域和被覆盖区域。裁剪输出范围计算-
  在生成裁剪区域的时候,根据Z_order依次,每个Layer在计算自己在屏幕的可显示区域时,需要经历如下步骤:
  1)以自己的W,H给出自己初始的可见区域
  2)减去自己上面窗口所覆盖的区域
                     Android核心分析之二十六Android GDI之SurfaceFlinger

852.jpg (6.54 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:55 上传

 

  在绘制时,Layer将根据自己的可将区域做相应的区域数据Copy。
  (3)handleRepaint()
  composeSurfaces(需要刷新区域):
  根据每个Layer的可见区域与需要刷新区域的交集区域从Z-Order序列从底部开始绘制到主Surface上。
  (4)postFramebuffer()
  (DisplayHardware)hw。flip(mInvalidRegion);
  eglSwapBuffers(display,mSurface) :将mSruface投递到屏幕。
  5 总结
  现在SurfaceFlinger干的事情利用下面的示意图表示出来:
                   Android核心分析之二十六Android GDI之SurfaceFlinger

369.jpg (27.07 KB, 下载次数: 0)

下载附件  保存到相册

2012-3-22 12:55 上传

 

 

Android核心分析之二十六Android GDI之SurfaceFlinger的更多相关文章

  1. Android核心分析之二十四Android GDI之显示缓冲管理

    Android GDI之屏幕设备管理-动态链接库 万丈高楼从地起,从最根源的硬件帧缓冲区开始.我们知道显示FrameBuffer在系统中就是一段内存,GDI的工作就是把需要输出的内容放入到该段内存的某 ...

  2. Android核心分析之二十八Android GDI之Surface&Canvas

    Surface&Canvas Canvas为在画布的意思.Android上层的作图几乎都通过Canvas实例来完成,其实Canvas更多是一种接口的包装.drawPaints ,drawPoi ...

  3. Android核心分析之二十五Android GDI之共享缓冲区机制

    Androird GDI之共享缓冲区机制 1  native_handle_t对private_handle_t 的包裹     private_handle_t是gralloc.so使用的本地缓冲区 ...

  4. Android核心分析之二十二Android应用框架之Activity

    3 Activity设计框架 3.1 外特性空间的Activity    我们先来看看,android应用开发人员接触的外特性空间中的Activity,对于AMS来讲,这个Activity就是客服端的 ...

  5. Android核心分析之二十Android应用程序框架之无边界设计意图

    Android应用程序框架1 无边界设计理念 Android的应用框架的外特性空间的描述在SDK文档(http://androidappdocs.appspot.com/guide/topics/fu ...

  6. Android核心分析之二十一Android应用框架之AndroidApplication

    Android Application Android提供给开发程序员的概念空间中Application只是一个松散的表征概念,没有多少实质上的表征.在Android实际空间中看不到实际意义上的应用程 ...

  7. Android项目实战(二十六):蓝牙连接硬件设备开发规范流程

    前言: 最近接触蓝牙开发,主要是通过蓝牙连接获取传感器硬件设备的数据,并进行处理. 网上学习一番,现整理出一套比较标准的 操作流程代码. 如果大家看得懂,将来只需要改下 硬件设备的MAC码 和 改下对 ...

  8. Android核心分析之二十三Andoird GDI之基本原理及其总体框架

     Android GDI基本框架 在Android中所涉及的概念和代码最多,最繁杂的就是GDI相关的代码了.但是本质从抽象上来讲,这么多的代码和框架就干了一件事情:对显示缓冲区的操作和管理. GDI主 ...

  9. Android核心分析 之二方法论探讨之概念空间篇

    方法论探讨之概念空间篇 我们潜意识就不想用计算机的方式来思考问题,我们有自己的思维描述方式,越是接近我们思维描述方式,我们越容易接受和使用.各种计算机语言,建模工具,不外乎就是建立一个更接近人的思维方 ...

随机推荐

  1. VC非法内存值的判断

    0xcdcdcdcd - Created but not initialised0xdddddddd - Deleted0xfeeefeee - Freed memory set by NT's he ...

  2. $q服务的API详解

    下面我们通过讲解$q的API让你更多的了解promise异步编程模式.$q是做为angularjs的一个服务而存在的,只是对promise异步编程模式的一个简化实现版,源码中剔除注释实现代码也就二百多 ...

  3. MD5是什么,怎么用着怪怪的

    写作目的 通常我们在使用加密算法时,都是直接调用一个方法,比如Base64,直接把待加密的字符串给加密好了.对于某些使用公私钥的算法,最多再传入一段公钥即可.但是在使用MD5算法的时候,总是需要用到一 ...

  4. Swift - 使用UI Dynamics给UIKit组件添加重力和碰撞行为

    UI Dynamics是UIKit的一个新组成部分,它向iOS中的视图提供了与物理学有关的功能和动画.可以让你向视图中引入力和物理属性,可以让你的视图弹跳,舞动,受重力影响等等. 下面通过样例,演示使 ...

  5. hr定位

    css里写 <style> hr{ position:relative; top: 500px; } </style> 重要!!! hr不能绝对定位, 只能相对定位,所以 hr ...

  6. BZOJ 3083&colon; 遥远的国度&lpar;树链剖分&plus;DFS序&rpar;

    可以很显而易见的看出,修改就是树链剖分,而询问就是在dfs出的线段树里查询最小值,但由于这道题会修改根节点,所以在查询的时候需判断x是否为root的祖先,如果不是就直接做,是的话应该查询从1-st[y ...

  7. CF1153 F&period; Serval and Bonus Problem&lpar;dp&rpar;

    题意 一个长为 \(l\) 的线段,每次等概率选择线段上两个点,共选出 \(n\) 条线段,求至少被 \(k\) 条线段覆盖的长度期望. 数据范围 \(1 \le k \le n \le 2000, ...

  8. ubuntu16&period;04运行ros的时候编译工作空间catkin&lowbar;make出现的一个问题Could not find a package configuration file provided by

    最近在进行ros里面的gazebo仿真之前需要对自己创建的工作空间进行编译,但是进行编译的时候输入catkin_make出现如下错误提示 查阅ROS问答社区之后发现两个比较有用的链接,如下 https ...

  9. MVC笔记--特性路由

    物性路由:将路由和控制器放在一起,这样更简单方便,还可以处理复杂的路由场景 传统路由:集中.强制.基于代码风格来定义的. 每个MVC应用程序都需要路由来定义自己的处理请求方式,路由是MVC是应用程序的 ...

  10. MyCAT入门实践

    1.MyCAT简单介绍 MyCAT是一个彻底开源的,面向企业应用开发的大数据库集群,支持事务.ACID.可以替代MySQL的加强版数据库,是一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Or ...