整个流水线中 app 本身并不负责渲染,渲染则是由一个独立的进程负责,即 Render Server 进程。下边会详细介绍一下整个 pipeline 的流程。
- 应用阶段
- 视图的创建
- 布局计算
- 对图层进行打包,在下一次 RunLoop 时将其发送至 Render Server
- app 处理用户的点击操作,在这个过程中 app 可能需要更新视图树,如果视图树发生更新,图层树也会被更新
- 其次,app 通过 CPU 完成对显示内容的计算
- Render Server & GPU
- 这一阶段主要执行 metal、Core Graphics 等相关程序,并调用 GPU 在物理层上完成对图像的渲染
- GPU 将渲染后的位图数据存储到 Frame Buffer
- Display
- 视频控制器将帧缓冲区的位图数据一帧一帧的显示在物理屏幕上
如果把把上边的步骤串在一起,会发现它们执行消耗的时间超过了 16.67 ms,因此为了满足对屏幕的 60 FPS 刷新率的支持,需要通过流水线的方式将这些步骤并行执行,如下图所示。每一个阶段都在源源不断的给下一个阶段输送产物。这时候就可以满足 16.67 毫秒产生一帧数据的要求了。
安卓渲染原理安卓上层显示系统安卓中 Activity 的一个重要的职责就是对界面生命周期的管理,这也就伴随了对视图窗口的管理。这中间就涉及了两个 Android 中两个主要的服务,AMS(ActivityManagerService)和WMS(WindowManagerService)。
在 Android 中,一个 view 会有对应的 canvas。视图树对应一个 canvas 树,Surfaceflinger 控制多个 canvas 的合成。最终渲染完成输出位图数据,显示到手机屏幕。