Android GDI之SurfaceFlinger
SurfaceFinger按英文翻译过来就是Surface投递者。SufaceFlinger的构成并不是太复杂,复杂的是他的客户端建构。SufaceFlinger主要功能是:
1) 将Layers (Surfaces) 内容的刷新到屏幕上
2) 维持Layer的Zorder序列,并对Layer最终输出做出裁剪计算。
3) 响应Client要求,创建Layer与客户端的Surface建立连接
4) 接收Client要求,修改Layer属性(输出大小,Alpha等设定)
但是作为投递者的实际意义,我们首先需要知道的是如何投递,投掷物,投递路线,投递目的地。
1 SurfaceFlinger的基本组成框架
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和服务端对象关系图
Client端与SurfaceFlinger连接图:
Client对象:一般的在客户端都是通过SurfaceComposerClient来跟SurfaceFlinger打交道。
3 主要对象说明
3.1 DisplayHardware &FrameBuffer
首先SurfaceFlinger需要操作到屏幕,需要建立一个屏幕硬件缓冲区管理框架。Android在设计支持时,考虑多个屏幕的情况,引入了graphicPlane的概念。在SurfaceFlinger上有一个graphicPlane数组,每一个graphicPlane对象都对应一个DisplayHardware.在当前的Android(2.1)版本的设计中,系统支持一个graphicPlane,所以也就支持一个DisplayHardware。
SurfaceFlinger,Hardware硬件缓冲区的数据结构关系图。
3.2 Layer
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的运行框架
我们从前面的章节<Android Service>的基本原理可以知道,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的动作示意图:
4.2 ThreadLoop
(1)handleTransaction(…):主要计算每个Layer有无属性修改,如果有修改着内用需要重画。
(2)handlePageFlip()
computeVisibleRegions:根据Z-Order序列计算每个Layer的可见区域和被覆盖区域。裁剪输出范围计算-
在生成裁剪区域的时候,根据Z_order依次,每个Layer在计算自己在屏幕的可显示区域时,需要经历如下步骤:
1)以自己的W,H给出自己初始的可见区域
2)减去自己上面窗口所覆盖的区域
在绘制时,Layer将根据自己的可将区域做相应的区域数据Copy。
(3)handleRepaint()
composeSurfaces(需要刷新区域):
根据每个Layer的可见区域与需要刷新区域的交集区域从Z-Order序列从底部开始绘制到主Surface上。
(4)postFramebuffer()
(DisplayHardware)hw.flip(mInvalidRegion);
eglSwapBuffers(display,mSurface) :将mSruface投递到屏幕。
5 总结
现在SurfaceFlinger干的事情利用下面的示意图表示出来:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/maxleng/archive/2010/06/14/5671271.aspx
分享到:
相关推荐
[经典文档]Android核心分析 核心分析之一 ----- 分析方法论探讨之设计意图 ...核心分析之二十六 ----- Android GDI之SurfaceFlinger动态结构示意图 核心分析之二十七 ----- Android GDI之Surface&Canvas;
Android的GDI系统是一个复杂的系统,它涉及到许多概念和代码,包括但不限于SurfaceFlinger、Surface、Canvas、Layer等。这些概念抽象了底层的物理设备操作,并为应用程序员提供了一种逻辑设备上下文,使他们能够在不...
8.GDI机制:Android GDI之基本原理及其总体框架、Android GDI之显示缓冲管理、Android GDI之共享缓冲区机制、Android GDI之SurfaceFlinger。 通过本文档的知识点,读者可以更好地理解Android系统的架构设计和核心...
Android GDI 基本框架是 Android 中最复杂的代码之一,涉及到显示缓冲区的操作和管理。GDI 主要管理图形图像的输出,从整体方向上来看,GDI 可以被认为是一个物理屏幕使用的管理器。 GDI 的主要工作是将文本、线条...
#### 二十七、AndroidGDI之SurfaceFlinger之动态结构示意图 提供了SurfaceFlinger组件内部动态结构的可视化图解。 #### 二十八、AndroidGDI之Surface&Canvas 研究了Surface和Canvas组件在图形渲染过程中的作用和...
[转]Android核心分析 技术专题之二十六--Android GDI之SurfaceFlinger.
#### AndroidGDI之SurfaceFlinger之动态结构示意图 通过动态结构示意图可以更直观地理解SurfaceFlinger如何管理和调度不同窗口的图像。 #### AndroidGDI之Surface&Canvas Surface和Canvas是Android图形系统中两个...
#### 二十七、AndroidGDI之SurfaceFlinger之动态结构示意图 这部分内容通过示意图的方式直观展示了SurfaceFlinger的动态结构,帮助读者更好地理解其工作原理。 #### 二十八、AndroidGDI之Surface&Canvas 这部分...
Android 核心分析 之一--------...Android 核心分析(27)-----Android GDI 之 SurfaceFlinger 之动态结构示意图..123 Android 核心分析(28)-----Android GDI 之 Surface&Canvas..................................126
Android核心分析之一--------分析方法论...Android核心分析(27)-----AndroidGDI之SurfaceFlinger之动态结构示意图..123 Android核心分析(28)-----AndroidGDI之Surface&Canvas..................................126
1. **SurfaceFlinger**:作为Android GDI的核心,SurfaceFlinger负责协调和合成各个应用程序的Surface到最终显示的帧缓冲区。它处理窗口堆栈、动画以及透明度等效果,将不同应用的Surface合成为一帧画面并推送到屏幕...
#### 二十七、AndroidGDI之SurfaceFlinger之动态结构示意图 - **动态结构**:这部分内容提供了SurfaceFlinger动态结构的示意图,有助于理解其内部组件间的交互关系。 - **结构解析**:详细解析了示意图中的各个组成...
在Android系统中,GDI(Graphics Device Interface)是图形设备接口,主要负责管理图形图像的输出,确保在物理屏幕上正确地呈现各种窗口内容。在Android的GDI框架中,核心任务是对显示缓冲区进行操作和管理,使得...
SurfaceFlinger作为Android图形系统的核心组件之一,负责管理屏幕上的多个显示层,并控制它们的合成与渲染,以确保用户界面流畅、高效地显示。本文将深入解析SurfaceFlinger的工作原理及其实现机制,帮助读者更好地...
### Android SurfaceFlinger 显示缓冲区管理 #### 概述 在Android系统中,SurfaceFlinger扮演着极其重要的角色——负责管理和协调多个应用程序窗口的显示。这篇文章深入探讨了SurfaceFlinger与应用程序之间如何...
[转]Android核心分析 技术专题之二十七--GDI 之SurfaceFlinger之动态结构示意图.
SurfaceFlinger是Android的合成器,负责应用窗口的合成工作,它根据Z轴顺序和透明度,将多个应用的窗口内容混合成最终显示在屏幕上的图像。Surface和Canvas则是Android图形系统中的基础类,用于创建和绘制图形界面。...
源码分析可能涉及SurfaceFlinger服务,它是Android系统中负责将不同应用的图层组合在一起并显示到屏幕上的关键组件。 工具在Android开发中同样重要。IDE如Android Studio提供了强大的集成开发环境,包括代码编辑、...
**Android核心分析(24):** 显示缓冲管理是GDI中的关键环节之一,这部分内容详细解释了缓冲区的分配、回收以及同步机制。 **Android核心分析(25):** 共享缓冲区机制允许不同的应用程序或组件之间高效地共享图像...