Android GUI系统之SurfaceFlinger(7) 应用程序的典型绘图流程

1.1.1 应用程序的典型绘图流程

我们知道,BufferQueue有最多达32个BufferSlot,这样设计的目的是什么?一个可能的原因就是提高图形渲染速度。因为假如只有两个buffer,可以想象一下,当应用程序这个生产者的产出效率大于消费者的处理速度时,很快它就会dequeue完所有缓冲区而处于等待状态,从而导致不必要的麻烦。当然,实际上32只是最大的容量,具体值是可以设置的,大家可以结合后面的ProjectButter小节来理解一下。

前面小节我们已经学习了BufferQueue的内部原理,那么应用程序又是如何与之配合的呢?

解决这个疑惑的关键就是了解应用程序是如何执行绘图流程的,这也是本节我们叙述的重点。不过大家应该有个心里准备,应用程序并不会直接使用BufferQueue。和Android系统中很多其它地方一样,“层层包裹”在这里同样是存在的,因而我们要尽量抓住其中的重点,并辅以一定的手段,才能更好更快地从诸多错综复杂的类关系中找出问题的答案。

出于以上原因的考虑,我们选取系统的开机动画这一应用程序,来分析整个图形绘制的流程。值得一提的是,这个开机动画的实现符合前面提到的两个改进的图形系统中的第一个,即应用程序与SurfaceFlinger都是使用OpenGL ES来完成UI显示,不过因为它是一个C++程序,所以不需要上层GLSurfaceView的支持。

当一个Android设备上电后,正常情况下它会先后显示最多4个不一样的开机画面,分别是:

l  boot-loader

这显然是第一个出现的画面。因为boot-loader只是负责系统后续模块的加载与启动,而且要求文件体积很小,所以一般我们只让它显示一张静态的图片

l  kernel

在进入内核后,同样会在物理屏幕上有所显示。和boot-loader一样,默认情况下它也只是一张静态图片

l  android(2个)

Android是系统启动的最后一个阶段,也是最耗时间的一个。它的开机画面既可以是静态文字描述、静态图片,也可以是动态画面。通常第一个是文字或者静态图片(假如指定路径下的图片不存在的话,就显示文字。关于这方面的资料很多,大家可以自行查阅,我们这里不作过多叙述),另外一个则是动画,如下图所示:

图 11?14 原生态Android系统中的开机动画

时间: 2024-10-31 12:29:08

Android GUI系统之SurfaceFlinger(7) 应用程序的典型绘图流程的相关文章

Android GUI系统之SurfaceFlinger(8) 应用程序与BufferQueue的关系

1.1.1 应用程序与BufferQueue的关系 接着上一小节未解决完的问题继续讲解. 现在我们已经明白了应用程序利用SurfaceFlinger进行绘制工作的大致流程了,只不过在这个过程中直到最后才出现了BufferQueue.应用程序具体是如何借助BufferQueue来完成工作的呢? 仔细观察不难发现,当应用端通过ISurfaceComposerClient::createSurface()来发起创建Surface的请求时,SurfaceFlinger服务进程这边会创建一个Layer.既

Android GUI系统之SurfaceFlinger(1)OpenGLES与EGL

第1章  GUI系统之SurfaceFlinger 在进入GUI系统的学习前,建议大家可以先阅读本书应用篇中的"OpenGLES"章节,并参阅OpenGL ES官方指南.因为Android的GUI系统是基于OpenGL/EGL来实现的,如果没有一定基础的话,分析源码时有可能会"事倍功半". 1.1 OpenGLES与EGL SurfaceFlinger虽然是GUI的核心,但相对于OpenGL ES来讲,它其实只是一个"应用". 对于没有做过Ope

Android GUI系统之SurfaceFlinger(4)

opengl es本地窗口SurfaceTextureClient 1.1.1 SurfaceTextureClient 针对应用程序端的本地窗口是SurfaceTextureClient,和FramebufferNativeWindow一样,它必须继承ANativeWindow: class SurfaceTextureClient    : publicANativeObjectBase<ANativeWindow, SurfaceTextureClient,RefBase> 这个本地窗口

Android GUI系统之SurfaceFlinger(11) SurfaceComposerClient

1.1.1 SurfaceComposerClient 图 11?28 每个应用程序在SurfaceFlinger中都对应一个Client SurfaceFlinger运行于SystemServer这一系统进程中,需要UI界面显示的应用程序则通过binder服务与它进行跨进程通信.在音频系统的学习中,每一个AudioTrack在AudioFlinger中都可以找到一个对应的Track实现.这种设计方式同样适用于显示系统,即任何有UI界面的程序都在SurfaceFlinger中有且仅有一个Clie

Android GUI系统之SurfaceFlinger(3)

Android中的本地窗口FramebufferNativewindow  1.1 Android中的本地窗口 在OpenGL的学习过程中,我们不断提及"本地窗口"(NativeWindow)这一概念.那么对于Android系统来说,它是如何将OpenGL ES本地化的呢,或者说,它提供了什么样的本地窗口? 根据整个Android系统的GUI设计理念,我们不难猜想到至少需要两种本地窗口: 面向管理者(SurfaceFlinger) 既然SurfaceFlinger扮演了系统中所有UI界

Android GUI系统之SurfaceFlinger(9) Project Butter黄油计划

1.1 SurfaceFlinger 从这一小节开始,我们正式切入SurfaceFlinger的分析.为了保持讲解的连贯性,部分内容可能在前面的章节中已经有所涉及了,接下来将会对其中的细节做更多的扩展讲解. 内容组织如下: l  首先介绍Android 4.1引入的新特性(Project Butter),理解这个项目是必要的,可以说SurfaceFlinger有很大一部分的内容就是围绕它来的 l  SurfaceFlinger的启动过程及工作方式 l  SurfaceFlinger与Buffer

Android GUI系统之SurfaceFlinger(18) postFramebuffer

1.1.1 postFramebuffer 在多缓冲区机制中,只有把显示数据写入framebuffer才能真正在物理屏幕上显示.前面几个小节的输出都是backbuffers,我们还需要最后一步--postFramebuffer. void SurfaceFlinger::postFramebuffer() {-        const DisplayHardware&hw(graphicPlane(0).displayHardware());    -    hw.flip(mSwapRegi

Android GUI系统之SurfaceFlinger(12) VSync信号的产生和处理

1.1 VSync的产生和处理 前面小节ProjectButter中我们学习了Android 4.1显示系统中的新特性,其中一个就是加入了VSync同步.我们从理论的角度分析了采用这一机制的必要性和运作机理,那么SurfaceFlinger具体是如何实施的呢? 先来想一下有哪些东西要考虑: · VSync信号的产生和分发 如果有硬件主动发出这一信号,那是最好的了;否则就得通过软件定时模拟来产生 · VSync信号的处理 当信号产生后,SurfaceFlinger如何在最短的时间内响应,具体处理流

Android GUI系统之SurfaceFlinger(5) BufferQueue内部原理

1.1 BufferQueue详解 上一小节我们已经看到了BufferQueue,它是SurfaceTextureClient实现本地窗口的关键.从逻辑上来推断,BufferQueue应该是驻留在SurfaceFlinger这边的进程中.我们需要进一步解决的疑惑是: 每个应用程序可以对应几个BufferQueue,它们是一对一.多对一或者是一对多? 应用程序所需要的绘图空间是由谁分配的? 在音频系统的学习中,我们知道AudioTrack和AudioFlinger是通过共享内存的形式来进行数据传递