Android_GDI基本框架and Surface Flinger

合集下载

android surface用法 -回复

android surface用法 -回复

android surface用法-回复Android Surface用法详解Android Surface,即安卓表面,是Android平台中重要的图形处理组件之一。

它提供了一个用于绘制2D图形的画布,同时也允许其他线程对其进行修改。

在本文中,我们将一步一步地介绍Android Surface的用法,帮助读者更好地理解和使用这个重要的组件。

第一步:创建SurfaceView在使用Android Surface之前,我们首先需要在布局文件中添加一个SurfaceView。

SurfaceView是一个可以直接与Surface进行交互的视图组件。

我们可以使用如下的XML代码在布局文件中创建一个SurfaceView:XML<SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="match_parent" />同时,我们还需要在Java代码中找到布局文件中的SurfaceView,并对其进行初始化。

可以使用如下的代码获取SurfaceView的实例:JavaSurfaceView surfaceView = findViewById(R.id.surfaceView);第二步:获取SurfaceHolder对象接下来,我们需要获取SurfaceHolder对象。

SurfaceHolder是与SurfaceView绑定的对象,它可以用于管理SurfaceView的生命周期,以及对其进行操作。

我们可以通过调用SurfaceView的getHolder()方法来获取SurfaceHolder对象:JavaSurfaceHolder surfaceHolder = surfaceView.getHolder();第三步:设置SurfaceHolder的回调方法SurfaceHolder提供了一些回调方法,使我们能够在Surface发生变化时得到通知,进而对其进行操作。

surfaceflinger analysis -回复

surfaceflinger analysis -回复

surfaceflinger analysis -回复什么是SurfaceFlinger?什么是Surface?SurfaceFlinger是安卓操作系统中的一个重要组件,它负责管理和渲染应用程序界面。

它是一个系统级别的服务,负责控制显示的缓冲区和组合多个应用程序的渲染图层,并将最终结果呈现到设备的屏幕上。

SurfaceFlinger基于Android系统的视图系统,并通过硬件加速来提供高效的图像渲染。

Surface是SurfaceFlinger中的一个概念,它代表了一块图像的一块内存区域。

应用程序可以将自己的图像绘制到Surface上,然后SurfaceFlinger 将这些Surface合成为最终的图像输出。

接下来,我们将逐步分析SurfaceFlinger的工作过程。

第一步:应用程序的图像绘制当应用程序需要更新界面时,它将自己的绘制内容渲染到一个称为Surface的内存区域中。

每个应用程序可以拥有一个或多个Surface。

第二步:Surface合成在SurfaceFlinger中,会维护一个Surface列表,其中包含所有应用程序的Surface。

SurfaceFlinger根据特定的规则对这些Surface进行排序并合成最终的图像。

Surface列表中的每个Surface都有一个Z-order属性,用于决定其显示的顺序。

具有较小Z-order值的Surface将在具有较大Z-order值的Surface之后显示。

这意味着具有较大Z-order值的Surface将覆盖在具有较小Z-order值的Surface之上。

此外,Surface还可以具有透明度属性,使其可以透过下方的Surface显示。

这样一来,SurfaceFlinger可以按照正确的顺序合成图像,将具有较高透明度的Surface显示在较低透明度的Surface之上。

第三步:图像缓冲区和硬件加速在SurfaceFlinger合成Surface时,它会涉及到两个重要的概念:图像缓冲区和硬件加速。

Android系统Surface机制的SurfaceFlinger服务的线程模型分析剖析

Android系统Surface机制的SurfaceFlinger服务的线程模型分析剖析

Android系统Surface机制的SurfaceFlinger服务的线程模型分析在前面两篇文章中,我们分析了SurfaceFlinger服务的启动过程以及SurfaceFlinger服务初始化硬件帧缓冲区的过程。

从这两个过程可以知道,SurfaceFlinger服务在启动的过程中,一共涉及到了三种类型的线程,它们分别是Binder线程、UI渲染线程和控制台事件监控线程。

在本文中,我们就将详细分SurfaceFlinger服务的线程模型,即上述三种类型的线程是如何运行和交互的。

从一文可以知道,SurfaceFlinger服务是在System进程的主线程中启动的。

System进程的主线程在启动系统的关键服务之前,会先启动一个Binder线程池。

这样运行在System进程中的系统关系服务就可以与其它进程执行Binder进程间通信了。

SurfaceFlinger服务虽然是由System进程的主线程来负责启动的,但是最终它会运行在一个独立的线程中。

我们将这个独立的线程称为UI渲染线程,因为它负责渲染系统的UI。

从一文可以知道,SurfaceFlinger服务的UI渲染线程的启动的时候,会对系统的硬件帧缓冲区进行初始化。

在初始化的过程,又会创建另外一个线程来监控硬件帧缓冲区的睡眠/唤醒状态切换事件。

为了方便描述,我们这个线程称称为控制台事件监控线程。

上述的三种类型的线程的启动顺序,可以通过图1来描述,如下所示:从图1就可以清楚地看到,System进程的主线程负责启动Binder线程池,以及UI渲染线程,而UI渲染线程又负责启动控制台事件监控线程。

在这三种类型的线程中,UI渲染线程是主角,Binder线程和控制台事件监控线程是配角。

Binder线程池是为了让其它进程,例如Android应用程序进程,可以与SurfaceFlinger服务进行Binder进程间通信的,有一部分通信所执行的操作便是让UI渲染线程更新系统的UI。

Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析在前面的一系列文章中,我们学习了Android应用程序与SurfaceFlinger服务的关系,以及SurfaceFlinger服务的启动过程、初始化硬件帧缓冲区的过程、线程模型。

SurfaceFlinger服务所做的一切都是为了给Android应用程序提服务的,即为Android应用程序渲染它们的UI。

在本文中,我们就详细分析SurfaceFlinger服务渲染Android应用程序UI的过程。

从前面一文可以知道,SurfaceFlinger服务是通过它的UI渲染线程来将应用程序的UI渲染到硬件帧缓冲区中去的,因此,接下来我们就通过分析SurfaceFlinger服务的UI渲染线程的执行过程来分应用程序UI的渲染过程,这个过程如图1所示。

从图1就可以看出,SurfaceFlinger服务的UI渲染线程的执行过程如下所示:1. 调用SurfaceFlinger类的成员函数handleConsoleEvents来处理控制台事件。

2. 调用SurfaceFlinger类的成员函数handleTransaction来处理系统显示屏以及应用程序窗口的属性变化,例如大小、旋转方向变化等。

3. 调用SurfaceFlinger类的成员函数handlePageFlip来让各个应用程序窗口设置它们当前所要渲染的图形缓冲区。

4. 如果SurfaceFlinger服务在编译的时候指定了USE_COMPOSITION_BYPASS 宏,并且当前需要渲染的应用程序窗口只有一个,那么就会调用SurfaceFlinger类的成员函数handleBypassLayer来直接将这个应用程序窗口的图形缓冲区渲染到硬件帧缓冲区中去,否则的话,就要调用SurfaceFlinger类的成员函数handleRepaint来合成所有的应用程序窗口的图形缓冲区到一个主图形缓冲区中去。

Android_图形系统分析-surfaceFlinger流程

Android_图形系统分析-surfaceFlinger流程
numFds= sNumFds=1; numInts= sNumInts=8; 这个是 Parcel 中描述句柄的抽象模式。实际上是指的 Native_handle 所指向句柄对象的具体 内容: numFds=1 表示有一个文件句柄:fd/ numInts= 8 表示后面跟了 8 个 INT 型的数据:
从最上层到最底层的数据流的分析可以看到实际上 GDI 在上层为 GUI 提供一个抽象的 概念,就好像操作系统中的文件系统所提供文件,目录等抽象概念一 样,GDI 输出抽象成了 文本,画笔,位图操作等设备无关的操作,让应用程序员只需要面对逻辑的设备上下文进行输 出操作,而不要涉及到具体输出设备,以及输 出边界的管理。GDI 负责将文本、线条、位图等 概念对象映射到具体的物理设备,所以 GDI 的在大体方向上可以分为以下几大要素:
1.1 点的格式 对于不同的 LCD 来讲,FrameBuffer 的二进制格式不一样,并且可以分为两部分: 1)点的格式:通常将 Depth,即表示多少位表示一个点。
1 位表示一个点 2 位表示一个点 16 位表示一个点 32 位表示一个点(Alpha 通道) 2) 点内格式:RGB 分量分布表示。 例如对于我们常见的 16 位表示一个点
1.2 格式之间的转换 所以屏幕输出实际上是一个值映射的关系。我们可以有如下的点格式转换,
源格式可能来自单色位图和彩色位图,对于具体的目标机来讲,我们的目标格式可能就 是一种,例如 16 位(5/6/5)格式。其实就只存在一种格式的转换,即从目标格式都是 16 位格式。
但是,在设计 GDI 时,基本要求有一个可移植性好,所以我们还是必须考虑对于不同 点格式 LCD 之间的转换操作。所以在 GDI 的驱动程序中涉及到区域操作(Blit):我们在显示 缓冲区上做的最多的操作就是区块搬运。由此,很多的应用处理器使用了硬件图形加速器来 完成区域搬运:blit.从我们的主要操作的对象来看,可以分为两个方向:

android和IOS架构对比

android和IOS架构对比

IOS VS android
IOS历史
• • • • • • • • 1984年 乔布斯离开Apple 1996年 NeXT(六年) 2005 Mac OS(两年半) 2007 iOS
Android历史
• 2003年 AndyRubin创建Android公司 • 2005年 Google收购Android • 2007年 Android发布并建立全球性的联盟组 织(34家手机制造商软件开发商和84家硬件 制造商电信运营商) • 2010年 Linux内核大刀阔斧的改革之后, android与Linux开发主流彻底分道扬镳 (android2.2/2.3)并引入C/C++NDK支持C甚 至C++程序
苹果iOS系统的最接近用户的层面,包括了触摸、位置服务、摄像头等应用。
Cocoa Touch 层包含的框架
• UIKit 框架 (UIKit.framework) • Map Kit 框架 (MapKit.framework) • Message UI 框架(MessageUI.frameOS 是一个传统技 术的操作系统。它 有一个基于微内核 Mach 的 Darwin 内 核,有一个叫做 Cocoa Touch 的运 行时,用的是 Objective-C,这是 个 C 语言的超集
Android 在 Linux 内核 之上,集成了一个 Java 虚拟机 Dalvik, 整 个应用层跑在虚 拟机之上,而开发语 言用的是 Java
Java独立虚拟机
• Android是以Linux为核心的平台,使用Java 作为编程语言。Android上的应用都是java程 序,这就需要虚拟机,而Android上的应用 是带有独立虚拟机的,也就是每开一个应 用就会打开一个独立的虚拟机。这样设计 的原因是可以避免虚拟机崩溃导致整个系 统崩溃,但代价就是需要更多内存。

详解AndroidSurface系统

详解AndroidSurface系统

深入浅出详解Android Surface系统2011-05-05 14:44 Innost CSDN 字号:T| T本文详细介绍了Android中的Surface系统,采用情景分析的办法,详解了何为SurfaceFlinger,以及SurfaceFlinger的工作流程,以Activity函数调用为切入点来研究SurfaceFlinger。

AD:2014WOT全球软件技术峰会北京站课程视频发布一目的本篇文章的目的就是为了讲清楚Android中的Surface系统,大家耳熟能详的SurfaceFlinger到底是个什么东西,它的工作流程又是怎样的。

当然,鉴于SurfaceFlinger的复杂性,我们依然将采用情景分析的办法,找到合适的切入点。

一个Activity是怎么在屏幕上显示出来的呢?我将首先把这个说清楚。

接着我们把其中的关键调用抽象在Native层,以这些函数调用为切入点来研究SurfaceFlinger。

好了,开始我们的征途吧。

二 Activity是如何显示的最初的想法就是,Activity获得一块显存,然后在上面绘图,最后交给设备去显示。

这个道理是没错,但是Android的SurfaceFlinger是在System Server进程中创建的,Activity一般另有线程,这之间是如何...如何挂上关系的呢?我可以先提前告诉大家,这个过程还比较复杂。

好吧,我们从Activity最初的启动开始。

代码在framework/base/core/java/android/app/ActivityThread.java中,这里有个函数叫handleLaunchActivity。

[---->ActivityThread::handleLaunchActivity()]1.private final void handleLaunchActivity(ActivityRecord r, Intent customIntent) {2.3. Activity a = performLaunchActivity(r, customIntent);4.5.6.7.if (a != null) {8.10.11. Bundle oldState = r.state;12.13. handleResumeActivity(r.token, false, r.isForward);14.15.---->调用handleResumeActivity16.17.}handleLaunchActivity中会调用handleResumeActivity。

Android应用程序请求SurfaceFlinger服务创建Surface的过程分析

Android应用程序请求SurfaceFlinger服务创建Surface的过程分析

Android应用程序请求SurfaceFlinger 服务创建Surface的过程分析前面我们已经学习过Android应用程序与SurfaceFlinger服务的连接过程了。

连接上SurfaceFlinger服务之后,Android应用程序就可以请求SurfaceFlinger服务创建Surface。

而当有了Surface后,Android应用程序就可以用来渲染自己的UI了。

在本文中,我们将详细分析Android应用程序请求SurfaceFlinger服务创建Surface的过程。

在讲述Android应用程序请求SurfaceFlinger服务创建Surface之前,我们首先了解一个Surface是由什么组成的。

我们可以将Surface理解为一个绘图表面,Android应用程序负责往这个绘图表面填内容,而SurfaceFlinger服务负责将这个绘图表面的内容取出来,并且渲染在显示屏上。

在SurfaceFlinger服务这一侧,绘图表面使用Layer类来描述,Layer类的实现如图1所示。

Layer类继承了LayerBaseClient类;LayerBaseClient类继承了LayerBase类;LayerBase类继续了RefBase类。

从这些继承关系就可以看出,我们可以通过来引用Layer对象,从而可以自动地维护它们的生命周期。

Layer类内部的成员变量mUserClientRef指向了一个ClientRef对象,这个ClientRef 对象内部有一个成员变量mControlBlock,它指向了一个SharedBufferServer对象。

从前面一文可以知道,SharedBufferServer类是用来在SurfaceFlinger服务这一侧描述一个UI元数据缓冲区堆栈的,即在SurfaceFlinger服务中,每一个绘图表面,即一个Layer对象,都关联有一个UI元数据缓冲区堆栈。

LayerBaseClient类内部有一个类型为LayerBaseClient::Surface的弱指针,它引用了一个Layer::SurfaceLayer对象。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android Display System --- Surface Flinger SurfaceFlinger 是Android multimedia 的一个部分,在Android 的实现中它是一个service ,提供系统范围内的surface composer 功能,它能够将各种应用程序的2D 、3D surface 进行组合。

在具体讲SurfaceFlinger 之前,我们先来看一下有关显示方面的一些基础知识。

1 、原理分析让我们首先看一下下面的屏幕简略图:每个应用程序可能对应着一个或者多个图形界面,而每个界面我们就称之为一个surface ,或者说是window ,在上面的图中我们能看到4 个surface ,一个是home 界面,还有就是红、绿、蓝分别代表的3 个surface ,而两个button 实际是home surface 里面的内容。

在这里我们能看到我们进行图形显示所需要解决的问题:a 、首先每个surface 在屏幕上有它的位置,以及大小,然后每个surface 里面还有要显示的内容,内容,大小,位置这些元素在我们改变应用程序的时候都可能会改变,改变时应该如何处理?b 、然后就各个surface 之间可能有重叠,比如说在上面的简略图中,绿色覆盖了蓝色,而红色又覆盖了绿色和蓝色以及下面的home ,而且还具有一定透明度。

这种层之间的关系应该如何描述?我们首先来看第二个问题,我们可以想象在屏幕平面的垂直方向还有一个Z 轴,所有的surface 根据在Z 轴上的坐标来确定前后,这样就可以描述各个surface 之间的上下覆盖关系了,而这个在Z 轴上的顺序,图形上有个专业术语叫Z-order 。

对于第一个问题,我们需要一个结构来记录应用程序界面的位置,大小,以及一个buffer来记录需要显示的内容,所以这就是我们surface 的概念,surface 实际我们可以把它理解成一个容器,这个容器记录着应用程序界面的控制信息,比如说大小啊,位置啊,而它还有buffer 来专门存储需要显示的内容。

在这里还存在一个问题,那就是当存在图形重合的时候应该如何处理呢,而且可能有些surface 还带有透明信息,这里就是我们SurfaceFlinger 需要解决问题,它要把各个surface 组合(compose/merge) 成一个main Surface,最后将Main Surface 的内容发送给FB/V4l2 Output ,这样屏幕上就能看到我们想要的效果。

在实际中对这些Surface 进行merge 可以采用两种方式:一种就是采用软件的形式来merge ,还一种就是采用硬件的方式,软件的方式就是我们的SurfaceFlinger,而硬件的方式就是Overlay。

2 、OverLay因为硬件merge 内容相对简单,我们首先来看overlay 。

Overlay 实现的方式有很多,但都需要硬件的支持。

以IMX51 为例子,当IPU 向内核申请FB的时候它会申请3 个FB,一个是主屏的,还一个是副屏的,还一个就是Overlay 的。

简单地来说,Overlay就是我们将硬件所能接受的格式数据和控制信息送到这个Overlay FrameBuffer,由硬件驱动来负责merge Overlay buffer和主屏buffer中的内容。

一般来说现在的硬件都只支持一个Overlay,主要用在视频播放以及camera preview上,因为视频内容的不断变化用硬件Merge比用软件Merge要有效率得多,下面就是使用Overlay和不使用Overlay的过程:SurfaceFlinger中加入了Overlay hal,只要实现这个Overlay hal可以使用overlay的功能,这个头文件在:/hardware/libhardware/include/harware/Overlay.h,可以使用FB或者V4L2 output来实现,这个可能是我们将来工作的内容。

实现Overlay hal以后,使用Overlay接口的sequence就在:/frameworks/base/libs/surfaceflinger/tests/overlays/Overlays.cpp,这个sequnce是很重要的,后面我们会讲到。

不过在实际中我们不一定需要实现Overlay hal,如果了解硬件的话,可以在驱动中直接把这些信息送到Overlay Buffer,而不需要走上层的Android。

Fsl现在的Camera preview就是采用的这种方式,而且我粗略看了r3补丁的内容,应该在opencore的视频播放这块也实现了Overlay。

3、SurfaceFlinger现在就来看看最复杂的SurfaceFlinger,首先要明确的是SurfaceFlinger 只是负责merge Surface的控制,比如说计算出两个Surface重叠的区域,至于Surface需要显示的内容,则通过skia,opengl和pixflinger来计算。

所以我们在介绍SurfaceFlinger 之前先忽略里面存储的内容究竟是什么,先弄清楚它对merge 的一系列控制的过程,然后再结合2D ,3D 引擎来看它的处理过程。

3.1 、Surface 的创建过程前面提到了每个应用程序可能有一个或者多个Surface ,我们需要一些数据结构来存储我们的窗口信息,我们还需要buffer 来存储我们的窗口内容,而且最主要的是我们应该确定一个方案来和SurfaceFlinger 来交互这些信息,让我们首先看看下面的Surface 创建过程的类图:在IBinder 左边的就是客户端部分,也就是需要窗口显示的应用程序,而右边就是我们的Surface Flinger service 。

创建一个surface 分为两个过程:一个是在SurfaceFlinger 这边为每个应用程序(Client) 创建一个管理结构,另一个就是创建存储内容的buffer ,以及在这个buffer 上的一系列画图之类的操作。

因为SurfaceFlinger 要管理多个应用程序的多个窗口界面,为了进行管理它提供了一个Client 类,每个来请求服务的应用程序就对应了一个Client 。

因为surface 是在SurfaceFlinger 创建的,必须返回一个结构让应用程序知道自己申请的surface 信息,因此SurfaceFlinger 将Client 创建的控制结构per_client_cblk_t经过BClient 的封装以后返回给SurfaceComposerClient ,并向应用程序提供了一组创建和销毁surface 的操作:为应用程序创建一个Client 以后,下面需要做的就是为这个Client 分配Surface ,Flinger 为每个Client 提供了8M 的空间,包括控制信息和存储内容的buffer。

在说创建surface 之前首先要理解layer 这个概念,回到我们前面看的屏幕简略图,实际上每个窗口就是z 轴上的一个layer ,layer 提供了对窗口控制信息的操作,以及内容的处理( 调用opengl 或者skia) ,也就是说SurfaceFlinger 只是控制什么时候应该进行这些信息的处理以及处理的过程,所有实际的处理都是在layer 中进行的,可以理解为创建一个Surface 就是创建一个Layer 。

不得不说Android 这些乱七八糟的名字,让我绕了很久……创建Layer 的过程,首先是由这个应用程序的Client 根据应用程序的pid 生成一个唯一的layer ID ,然后根据大小,位置,格式啊之类的信息创建出Layer 。

在Layer 里面有一个嵌套的Surface 类,它主要包含一个ISurfaceFlingerClient::Surface_data_t ,包含了这个Surace 的统一标识符以及buffer 信息等,提供给应用程序使用。

最后应用程序会根据返回来的ISurface 信息等创建自己的一个Surface 。

Android 提供了4 种类型的layer 供选择,每个layer 对应一种类型的窗口,并对应这种窗口相应的操作:Layer,LayerBlur,LayerBuffer,LayerDim。

不得不说再说Android 起的乱七八糟的名字,LayerBuffer 很容易让人理解成是Layer 的Buffer ,它实际上是一种Layer 类型。

各个Layer 的效果大家可以参考Surface.java 里面的描述:/frameworks/base/core/java/android/view/surface.java 。

这里要重点说一下两种Layer ,一个是Layer (norm layer) ,另一个是LayerBuffer 。

Norm Layer 是Android 种使用最多的一种Layer ,一般的应用程序在创建surface 的时候都是采用的这样的layer ,了解Normal Layer 可以让我们知道Android 进行display 过程中的一些基础原理。

Normal Layer 为每个Surface 分配两个buffer :front buffer和back buffer,这个前后是相对的概念,他们是可以进行Flip 的。

Front buffer 用于SurfaceFlinger 进行显示,而Back buffer 用于应用程序进行画图,当Back buffer 填满数据(dirty) 以后,就会flip ,back buffer 就变成了front buffer 用于显示,而front buffer 就变成了back buffer 用来画图,这两个buffer 的大小是根据surface 的大小格式动态变化的。

这个动态变化的实现我没仔细看,可以参照:/frameworks/base/lib/surfaceflinger/layer.cpp中的setbuffers() 。

两个buffer flip 的方式是Android display 中的一个重要实现方式,不只是每个Surface 这么实现,最后写入FB 的main surface 也是采用的这种方式。

LayerBuffer 也是将来必定会用到的一个Layer ,个人觉得也是最复杂的一个layer ,它不具备render buffer ,主要用在camera preview / video playback 上。

它提供了两种实现方式,一种就是post buffer ,另外一种就是我们前面提到的overlay ,Overlay 的接口实际上就是在这个layer 上实现的。

相关文档
最新文档