GUI(Graphic User Interface)即“图形用户界面”。Android 的 GUI 系统是基于 OpenGL/EGL 实现的。
9.4 Android中的本地窗口
- 面向管理者(SurfaceFlinger),本地窗口是 FramebufferNativeWindow。
- 面向应用程序,本地窗口是 Surface。
FramebufferNativeWindow 是专门为 SurfaceFlinger 服务的,由 Gralloc 提供支持。Surface 是为应用程序服务的,本质上还是由 SurfaceFlinger 服务统一管理,涉及很多跨进程通信细节。
9.5 BufferQueue详解
一块 Buffer 在处理过程中经历的生命周期依次是 FREE->DEQUEUED->QUEUED->ACQUIRED->FREE。
参与 Buffer 管理的 Owner 对象有3个:
- BufferQueue
BufferQueue 是一个服务中心,其他两个 Owner 必须通过它管理 Buffer。
- Producer
生产者就是“填充” Buffer 数据的人,通常情况下当然是应用程序。因为当应用程序不断地刷新UI,从而将产生的显示数据源源不绝地写到 Buffer 中。当 Producer 需要使用一块 Buffer 时,它首先会向中介 BufferQueue 发起 dequeue 申请,然后才能对指定的缓冲区进行操作。当 Producer 认为一块 Buffer 已经写入完成后,将调用 BufferQueue 的 queue 接口,把 Buffer 归还到 BufferQueue 队列中。
- Consumer
消费者与生产者是相对应的,它的操作同样受到 BufferQueue 的管控。当一块 Buffer 已经就绪后,Consumer 就可以开始工作了。
小结:
- 应用程序可以调用 createSurface 来建立多个 Layer,它们是一对多的关系。
- 每个 Layer 对应一个 BufferQueue。
9.6 SurfaceFlinger
一个典型的显示器有两个重要特性,即“行频和场频”。行频又称为“水平扫描频率”,是屏幕每秒钟从左至右扫描的次数;场频又称为“垂直扫描频率”,是每秒钟整个屏幕刷新的次数。
当扫描完一个屏幕后,设备需要重新回到第一行以进行下一轮的循环,此时有一段时间空隙,称为 Vertical Blanking Interval(VBI)。这个时间点就是进行缓冲区交换的最佳时间,因为此时屏幕没有在刷新。Vsync(垂直同步)是 Vertical Synchronization 的简写,它利用 VBI 时期出现的 Vertical Sync Pulse 来保证双缓冲能在最佳时间点进行交换。
大部分 Android 显示设备刷新频率是60Hz,这也就意味着每一帧最多只能留给系统1/60=16ms左右的准备时间。
Triple Buffering 是 Mutiple Buffering 的一种,指的是系统使用3个缓冲区用于显示工作。
接口的服务端 -- Client
SurfaceFlinger 运行于 SystemServer 进程中,需要显示UI界面的应用程序通过 Binder 服务与它进行跨进程通信。每个应用程序在 SurfaceFlinger 中都有 Client 对象为其提供服务,应用程序与 Client 间的 Binder 接口是 ISurfaceComposerClient。
9.7 Vsync 的产生和处理
Android 源码工程 surfaceflinger 目录下有一个 displayhardware 文件夹,其中 HWComposer 的主要职责之一,就是用于产生 Vsync 信号。Vsync 信号可由硬件实现或者软件模拟。