美文网首页
Android图形子系统之旅(一) - 主要组件角色介绍

Android图形子系统之旅(一) - 主要组件角色介绍

作者: Twist_Fate1 | 来源:发表于2020-06-06 00:20 被阅读0次

前言

Android 框架提供了各种用于 2D 和 3D 图形渲染的 API可与制造商的图形驱动程序实现方法交互,在Android平台上应用开发者可通过三种方式将图像绘制到屏幕上:使用 Canvas、OpenGL ES 或 Vulkan。
无论使用什么方式进行内容的生产,大家都需要遵循系统的规范流程,在系统关键组件的帮助下,最终按照我们的预期将画面完美的展示给用户。

而本系列文章也是我自己学习了解图形子系统的过程记录。
正所谓窥一斑而知全豹,由于整个图形子系统过于庞大,直接啃代码不知从何下手,所以我希望通过观察Android中一个具体图像帧的整个生命周期可以一窥整个Android系统的图形系统的工作流程以及工作模式。

希望通过了解Android图形的正确工作流程,帮助我们在实际生产中设计应用或者分析图形性能问题时做出高效明智的选择

可能使用到的部分工具介绍:

  • perfetto link
    perfetto

这是一款用于记录短期/长期内设备活动的工具,系统级图形代码中已经包含了非常多的提前打点,很多相关的框架代码也是如此,且该工具可以帮助我们准确的看到CPU调度,通过它我们可以更轻松的分析各个线程/进程之间的通信关系。

  • logcat


    logcat

Logcat 是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹。 应用内通过Log 类写入消息。

  • Android Code Search link
    Android Code Search

一个公共代码搜索工具,无需下载源代码即可浏览代码(好用!!)。

关键角色/组件:

先上一张Google官方提供的图,这张图展示了Android图形中各个关键组件之间如何协同工作:


关键组件如何协同工作

图像流的生产者:
图像流生产方可以是生成图形缓冲区以供消耗的任何内容。通常是我们开发的可视化应用,但它还可以是MediaPlayer,Camera,甚至SurfaceFlinger。

图像流的消费者:
图像流的最常见消费者是 SurfaceFlinger,该系统服务会消费当前可见的图形流数据,并使用WindowManager提供的元信息将它们合成到显示部分。SurfaceFlinger 是可以修改所显示部分内容的唯一服务,对于显示部分来说这是唯一的内容生产者。SurfaceFlinger使用GL 与 Hardware Composer 来将多个图形流来源合成为一个图形流。
但图形流的消费者并非只能是SurfaceFlinger,像某些App自身也可以是消费者,例如相机应用它会消费相机的预览图像流,视频播放器也可以消费来自解码器生产的图像流数据。

WindowManager
负责控制Window对象,它们是用于View对象的容器。Window对象由Surface提供支持。WindowManager 会监督生命周期、输入和聚焦事件、屏幕方向、转换、动画、位置、变形、Z 轴顺序以及窗口的许多其他方面。WindowManager 会将所有窗口元数据发送到 SurfaceFlinger,以便 SurfaceFlinger 可以使用这些数据在屏幕上合成 Surface。

Surface
一个接口,供生产方与使用方交换缓冲区。通常由图像缓冲区的消费者或者直接从图像缓冲区(例如SurfaceTexture)创建,然后交给某种生产者(例如OpenGL,MediaPlayer,或者Camera设备)进行绘制填充图像数据。

SurfaceFlinger link
SurfaceFlinger 接受图形生产者的缓冲区,并对它们进行合成,然后发送到屏幕。

BufferQueue
BufferQueues 是 Android 图形组件之间的粘合剂。它们是一对队列,可以调解缓冲区从生产方到消耗方的固定周期。一旦生产者移交其图像缓冲区,SurfaceFlinger 便会负责将所有内容合成到显示部分。

Hardware Composer
显示子系统的硬件抽象实现。SurfaceFlinger可以将某些合成工作委托给Hardware Composer(HWC),以分担部分GPU上的工作量。对于HWC来说,SurfaceFlinger 只是个图像流生产者。因此,在 SurfaceFlinger 将一个或两个缓冲区合成到第三个缓冲区中的过程中,它会使用 OpenGL ES。这样使合成的功耗比通过 GPU 执行所有计算更低。

Gralloc link

图形内存分配器,用来分配图像生产者请求的内存。

Android图形子系统关键的组件以及角色大致就这些。

下一篇文章将会正式进入分析图形系统.我会从非常简单的Demo应用入手,观察它的图像缓冲区是如何被创建的,而生产者又是如何拿到图像缓冲区的,框架部分在这里扮演了怎么样的一个角色,帮助我们做了哪些事情。

相关文章

网友评论

      本文标题:Android图形子系统之旅(一) - 主要组件角色介绍

      本文链接:https://www.haomeiwen.com/subject/ywoonhtx.html