落叶知秋|程序员必懂的Android 技术之 VSYNC、 Choreographer 起源( 二 )
解决方案是采用 Double Buffer 。
Double Buffer(双缓冲)背后的思想是让绘制和显示器拥有各自的图像缓冲区 。
GPU 始终将完成的一帧图像数据写入到 Back Buffer , 而显示器使用 Frame Buffer , 当屏幕刷新时 , Frame Buffer 并不会发生变化 , Back Buffer 根据屏幕的刷新将图形数据 copy 到 Frame Buffer , 这便是 VSYNC 的用武之地 。
注意 , VSYNC 信号负责调度从 Back Buffer 到 Frame Buffer 的交换操作 , 这里并不是真正的数据 copy , 实际是交换各自的内存地址 , 可以认为该操作是瞬间完成 。
在 Android 4.1 之前 , Android 便使用的双缓冲机制 。 怎么理解呢?
一般来说 , 在同一个 View Hierarchy 内的不同 View 共用一个 Window , 也就是共用同一个 Surface 。
每个 Surface 都会有一个 BufferQueue 缓存队列 , 但是这个队列会由 SurfaceFlinger 管理 , 通过匿名共享内存机制与 App 应用层交互
整个流程如下:
- 每个 Surface 对应的 BufferQueue 内部都有两个 Graphic Buffer , 一个用于绘制一个用于显示 。 系统会把内容先绘制到离屏缓冲区(OffScreen Buffer) , 在需要显示时 , 才把离屏缓冲区的内容通过 Swap Buffer 复制到 Front Graphic Buffer 中 。
- 这样 SurfaceFlinge 就拿到了某个 Surface 最终要显示的内容 , 但是同一时间我们可能会有多个 Surface 。 这里面可能是不同应用的 Surface , 也可能是同一个应用里面类似 SurfaceView 和 TextureView , 它们都会有自己独立的 Surface 。
- 这个时候 SurfaceFlinger 把所有 Surface 要显示的内容统一交给 Hardware Composer , 它会根据位置、Z-Order 顺序等信息合成为最终屏幕需要显示的内容 , 而这个内容会交给系统的帧缓冲区 Frame Buffer 来显示(Frame Buffer 是非常底层的 , 可以理解为屏幕显示的抽象) 。
2. 今生但是 UI 绘制任务可能会因为 CPU 在忙别的事情 , 导致没来得及处理 。 所以从 Android 4.1 开始 ,VSYNC 则更进一步 , 现在 VSYNC 脉冲信号开始用于下一帧的所有处理 。
Project Butter 首先对 Android Display 系统的 SurfaceFlinger 进行了改造 , 目标是提供 VSYNC 中断 。 没收到 VSYNC 中断后 , CPU 会立即准备 Buffer 数据 , 由于大部分显示设备刷新频率都是 60 Hz(一秒刷新 60 次) , 也就是说一帧数据的准备工作都要在 16ms 内完成
Triple Buffer(三重缓存)
如果理解了双缓冲机制的原理 , 那就非常容易理解什么是三缓冲区了 。 如果只有两个 Graphic Buffer 缓冲区 A 和 B , 如果 CPU / GPU 绘制过程较长 , 超过一个 VSYNC 信号周期 。
推荐阅读
- 落叶知秋|中芯国际将被美国拉黑,鸿蒙系统已有进展,未来科技方向在何方?
- 落叶知秋|解析无源RFID与有源RFID在仓库管理各大优势
- 中式客厅该怎么挂画 一看就懂的5大实用布局原则
- 落叶知秋|揭秘,IT培训行业营销拓客秘籍
- 落叶知秋|科技强警||城中警方研发水下机器人亮相国内顶尖舞台
- 程序员|“对不起,我们不要IT培训班出来的程序员”!
- 小熊回收站|“对不起,我们不要IT培训班出来的程序员”
- 落叶知秋|用了一年的iPhone 8,现在的我终于要把它换掉了
- 小熊科技|程序员你是怎么绘制架构图?
- 程序员|程序员:代码全部替换成中文,你能接受吗?
