Android图形显示系统——概述

Android的图形显示系统,虽然感觉自己基本了解了,有问题基本都能解决,但要写时,一是觉得千头万绪无从下笔,一是发现还有很多并没有真正搞懂。开工写这套体系,也顺便查漏补缺下。

Android图形显示系统的剖分

图形显示系统就像一个报社,它派出记者去采访,记者写成文稿后,将记者们交上来的文稿审核、排版、印刷,最终形成一期又一期报纸。


如上是Android图形显示系统的一个全貌图。每个Layer对应着一个Surface。Surface 由每个需要显示的进程View树创建(View树本身对应一个Surface,是为主线程UI的Surface,遇到SurfaceView时挖洞,产生额外的Surface),
View树的底端,实际渲染的View选取一种绘制方式,这可能是Widget(系统提供默认实现),Webcore(WebView走独立的渲染流程),Canvas(用户在Canvas层级上自定义绘制函数)和 OpenGL(GLSurfaceView,独立的渲染流程,由用户使用OpenGL实现渲染。)
SurfaceFlinger用来创建Layer,并且在上层绘制完成后,合成所有需要显示的Layer,送到LCD显示。其中gralloc是申请图形内存且连接fb(framebuffer)的模块,合成Layer时,优先选用hwcomposer,在hwcomposer无法解决时,采用默认的3D合成,也即调OpenGL标准接口,将各图层绘制到fb上。

以图中间那条线为界,显示系统划分为上下两层。
上层为应用级别的显示,解决如何绘制图层的问题,主要为java代码(记者采访/写作)。
下层为系统级别的显示,解决如何将绘制好的图层送显的问题(印刷),主要为C/C++代码。
一些调度的java代码,如起“排版”作用的WindowsManager,尽管起的作用是系统性的,由于是对外提供API,也归到上层显示。

应用级别的显示

这部分需要做的事情一是对开发者提供一套API,使其能简易的建立自己的UI界面。二是作一个排版工作,解析布局,管理View的层级。

显示相关API

和iOS一样,Google提供的API实际上也是分层级的,不过可能没有明确说明。

第一层级:View

这一层级主要是提供各种控件,如button、textview、image view等。

第二层级:Canvas

在开发者希望实现自定义的效果时,重载View的onDraw方法,或者直接用Surface获取Canvas,使用Canvas的API绘制自定义界面。这个Canvas调用的可能是软件的skia,也可能是硬件加速的hwui。

第三层级:OpenGL等

对于3D游戏而言,Android提供的Canvas是不能满足要求的,这时需要引入3D引擎直接调OpenGL。Android同样提供了这一套API。

View管理

这部分实际上相当于一个UI引擎,主要处理的是UI布局文件的解析,View层级关系的生成与管理,以及各个View逐级渲染的方法,逻辑极其复杂。

系统级别的显示

这部分主要解决这些问题:
1、如何申请可以用来送显的内存,如何将其送往LCD?
2、如何提供窗口系统?
3、如何同步合成/显示多个图层?
4、如何支持多屏?
相对于提供了各种各样控件,支持各种渲染体系的上层显示来说,系统级别的显示代码相对单纯,性能上基本做到了最好,可复用性也很高。

后续将会先介绍下层显示,然后再慢慢分析上层显示。

时间: 2025-01-30 07:39:21

Android图形显示系统——概述的相关文章

Android图形显示系统——下层显示3:窗口系统

Android之窗口系统 要点 1.Android窗口系统通过C-S架构和一套Buffer循环机制实现,在保证安全稳定的前提下基本上做到了极致性能(无大块内存拷贝,IPC通信内容最少). 2.SurfaceFlinger创建Layer,将其中的BufferQueueProducer作为IGraphicBufferProducer传给应用侧的Surface,因而构成窗口. 3.Surface是皮,BufferQueue是肉,通过这样的皮肉关系构建了Buffer循环机制.Buffer循环机制不仅用于

Android图形显示系统——下层显示4:图层合成下(硬件合成器)

硬件合成器-HwComposer 使用3D合成,需要大面积的像素混合计算和大量的内存传输(GPU读写GraphicBuffer所需),对GPU和DDR来说是一个巨大的负担.在GPU/DDR重度使用的场景(比如玩游戏),会造成发热.卡顿等. 为了提升性能,减少功耗,可以将合成这个过程交由另一个芯片完成,减轻GPU负担.进一步,直接让这个芯片连LCD,在LCD需要显示某一行时在线合成. HwComposer便是这一个/多个专用合成芯片的驱动HAL层. 驱动由集成芯片系统的厂商自行设计,但需要遵循一定

Android图形显示系统——一张图片的显示流程

Android设备上一张图片的显示过程 应用示例 假如我们现在有一张这样的风景照 想在Android设备(比如一个小米pad)上显示出来.首先想到的是写一个应用,用一个ImageView,把这张照片附到ImageView上显示,如下面的demo. MainActivity.java package com.example.pictureshow; import android.app.Activity; import android.os.Bundle; import android.view.

Android图形显示系统——上层显示2:硬件加速实现

Android界面绘制的硬件加速实现 Android的界面绘制的硬件加速采取上下整合的一套流程实现 一.代码结构 (一)Java HardwareRenderer->ThreadedRenderer:组织硬件加速渲染的类,下发创建显示列表和回放的指令. GLES20RecordngCanvas GLES20Canvas HardWareCanvas:与Canvas平级的UI渲染引擎支持,但这个Canvas只能存储命令到显示列表中,并在ThreadedRenderer中的渲染线程辅助下运行. Re

Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)

Android显示之图层合成 要点 1.图层合成指综合各个窗口的绘制内容,送往LCD显示的过程.从原理上可分为在线合成与离线合成两种方式. 2.在Android的SurfaceFlinger代码流程中,图层合成方式分3D合成(OpenGL)和硬件合成两大类. 3.图形系统采用垂直同步Vsync机制,由LCD上报vsync,触发图层合成. 图层合成的原理 什么是图层合成 以Android原生版本的Launcher为例,这个场景下有四个图层,状态栏.导航栏由SystemUI绘制,壁纸由壁纸服务提供,

《Android应用开发与系统改造实战》——1.1节初识庐山真面目—Android开发环境概述

1.1 初识庐山真面目-Android开发环境概述 Android应用开发与系统改造实战 "巧妇难为无米之炊",要想在Android平台上开发软件,必须装备好必备的工具,一个好的开发环境能够帮助我们快速地开发出想要的应用软件.伴随着Android的开放,Google也提供了一套开发工具,包括设备模拟器.Android资源打包工具aapt.Dalvik调试监控工具DDMS,adb调试桥和字节码转换工具Dx工具. 这些工具我们在开发基本应用时一般是用不着的,在后面的一些部分,会专门讲解An

理解Android Build系统

前言 Android Build 系统是 Android 源码的一部分.关于如何获取 Android 源码,请参照 Android Source 官方网站: http://source.android.com/source/downloading.html. Android Build 系统用来编译 Android 系统,Android SDK 以及相关文档.该系统主要由 Make 文 件,Shell 脚本以及 Python 脚本组成,其中最主要的是 Make 文件. 众所周知,Android

深入理解Android Build系统

概述 Android Build 系统是用来编译 Android 系统.Android SDK 以及相关文档的一套框架.在Android系统中,Android 的源码中包含了许许多多的模块. 不同产商的不同设备对于 Android 系统的定制都是不一样的.如何将这些模块统一管理起来,如何能够在不同的操作系统上进行编译,如何在编译时能够支持面向不同的硬件设备,不同的编译类型,且还要提供面向各个产商的定制扩展,Android系统如何解决这些问题呢?这就是我们不得不谈的Android Build 系统

Android零基础入门第16节:Android用户界面开发概述

原文:Android零基础入门第16节:Android用户界面开发概述 相信通过前面15期的学习,Android的开发环境已经基本掌握了,如果仍有问题,欢迎到Android零基础入门技术讨论微信群交流,从本期开始正式来一步一步踏入Android开发之路. Android应用开发的一项内容就是用户界面的开发.Android提供了非常丰富的用户界面组件,借助于这些用户界面组件,开发者可以非常方便地进行用户界面开发,而且可以开发出非常优秀的用户界面.     一.界面UI元素介绍   Android应