概览

官方简介:Android-Graphics

Android 图形系统

  • Image Stream Producers:图形出产者,用来生成图形缓冲区,以供图形顾客运用。例如OpenGL ES、Canvas 2D 和 mediaserver 视频解码器

  • Native Framework:Libgui库,包含了图形体系底层的基本元素,例如Surface、BufferQueue、GraphicBufferConsumer、GraphicBufferProducer、SurfaceComposer等等。

  • Window Positioning:WindowManager,用来操控 window 目标,window为一组view目标的调集。它为 SurfaceFlinger 供给缓冲区和窗口元数据,而 SurfaceFlinger 可运用这些信息将 Surface 组成到屏幕。

  • Image Stream Consumers:图形顾客,包含 SurfaceFlinger 和一些图形运用。

    • 图形流的最常见顾客是 SurfaceFlinger,该体系服务会耗费当时可见的 Surface,并运用 WindowManager 中供给的信息将它们组成到显现部分。SurfaceFlinger 运用 OpenGL 和 Hardware Composer 来组成一组 Surface。
    • 一些 OpenGL ES 运用也能够做为顾客,例如相机运用会消费相机预览图像流。非 GL 运用也可所以顾客,例如 ImageReader 类。
  • HAL:显现子体系的硬件抽象完成,包含 Hardware Composer 和 Gralloc。

    • SurfaceFlinger 能够将某些组成作业托付给 Hardware Composer,以分管 OpenGL 和 GPU 上的作业量。这时,SurfaceFlinger 仅仅充任另一个 OpenGL ES 客户端,Hardware Composer 则进行图形烘托的作业。Hardware Composer 有必要支撑事情,其间之一是 VSYNC(另一个是支撑即插即用 HDMI 的热插拔)。
    • Gralloc用来分配图形出产方恳求的内存。

Android 图形系统

BufferQueue

官方简介:Android-BufferQueue

Android 图形系统

左侧的目标是生成图形缓冲区的烘托器,如主屏幕、状态栏和体系界面。SurfaceFlinger 是组成器,而 Hardware Composer 是制作器。BufferQueue 是 Android 图形体系很重要的组成部分,它担任数据的传递:

Android 图形系统

图中的 producer 和 consumer 运行在不同的进程里,BufferQueue 是将缓冲区池与行列相结合的数据结构,它运用 Binder IPC 在进程之间传递缓冲区。几个重要函数如下:

  • producers 经过 BufferQueue 恳求一块空闲的缓存区(GraphicBuffer): IGraphicBufferProducer.dequeueBuffer 办法
  • 往缓存区(GraphicBuffer)填充了数据(制作等)后, producers 将缓存区(GraphicBuffer)入行列到 BufferQueue 中: IGraphicBufferProducer.queueBuffer 办法
  • consumer 从 BufferQueue 中出行列一块缓存区(GraphicBuffer): IGraphicBufferConsumer.acquireBuffer 办法
  • consumer 消费完毕后(典型的是 SurfaceFlinger 组成数据)将缓存区(GraphicBuffer)返回给行列: IGraphicBufferConsumer.releaseBuffer 办法

其间 IGraphicBufferProducer 是 BufferQueue 的出产者接口,完成类是 BufferQueueProducer 出产者类;IGraphicBufferConsumer 是 BufferQueue 的顾客接口,完成类是 BufferQueueConsumer 顾客类。

Android 图形系统

SurfaceFlinger

SurfaceFlinger 用来管理消费当时可见的 Surface, 所有被烘托的可见 Surface 都会被 SurfaceFlinger 经过 WindowManager 供给的信息组成(运用 OpenGL 和 HardWare Composer)提交到屏幕的后缓冲区,等候屏幕的下一个 Vsync 信号到来,再显现到屏幕上。SufaceFlinger 经过屏暗地缓冲区与屏幕树立联系,同时经过 Surface 与上层树立联系,起到了一个承上启下的效果。

Android 图形系统

SurfaceFlinger作业流程

Android 图形系统

SurfaceFlinger的registerCallback时的this便是SurfaceFlinger对ComposerCallback接口的完成。

  • onHotplugReceived

    热插拔事情,显现屏幕衔接或者断开时回调

  • onRefreshReceived

    接纳底层HWComposer的改写恳求,完成办法如下:

void SurfaceFlinger::onRefreshReceived(int sequenceId,hwc2_display_t /*display*/) {
    Mutex::Autolock lock(mStateLock);
    if (sequenceId !=getBE().mComposerSequenceId) {
        return;
    }
    repaintEverythingLocked();
}
void SurfaceFlinger::repaintEverythingLocked() {
      android_atomic_or(1, &mRepaintEverything);
      //触发改写,从头组成显现
      signalTransaction();
}
  • onVsyncReceived

    Vsync事情上报,接纳底层硬件上报的笔直同步信号。为什么需要笔直同步信号,参阅/post/686375…

组成方法

  • Client组成

将各个Layer的内容用GPU烘托到暂存缓冲区中,最后将暂存缓冲区传送到显现硬件,Client组成,选用RenderEngine进行组成

  • Device组成

硬件组成器进行组成HWComposer,其组成方法是将各个Layer的数据悉数传给显现硬件,并告知它从不同的缓冲区读取屏幕不同部分的数据

HWC相关图表

Android 图形系统

组成图表

Android 图形系统

Dump信息

`adb shell dumpsys SurfaceFlinger`

Android 图形系统

图层

图层(Layer)是组成的最重要单元;每个图层都有一组属性,用于定义它与其他层的交互方法。Layer在每一层中的代码的完成不一样,基本上Laye的理念都是一样的。

    frameworks/native/services/surfaceflinger
    ├── Layer.h
    ├── Layer.cpp 
    ├── ColorLayer.h
    ├── ColorLayer.cpp
    ├── BufferLayer.h
    └── BufferLayer.cpp

Android 图形系统

总结

整个图形显现体系能够简单地分为图形和显现两个体系了解。

  • 图形体系,供给绘图和图形处理的支撑。无论是2D的Skia,仍是3D的OpenGLES,还有各种图片解码库
  • 显现体系,图形制作好后,需要显现,就需要合并窗口,这个时分就需要用到Surfaceflinger,上层的显现体系有View、ActivityManagerService和WindowManagerService组成。一个窗口便是一个Surface,Surfacedlinger运用Layer去描绘一个窗口。