简述View 的绘制是如何把数据传递给 SurfaceFlinger 的 ?
在Android系统中,View的绘制过程是通过一系列步骤将显示内容最终传递给SurfaceFlinger,SurfaceFlinger再负责将这些内容显示到屏幕上。这个过程主要涉及应用层的View绘制和系统层的SurfaceFlinger处理。下面逐步解析这一过程:
- 应用层的View绘制流程
- 当一个Activity启动时,它的窗口会被创建,系统会为窗口分配一个Surface(用于在屏幕上显示内容的“画布”)。
- View绘制流程主要经过三大步骤:
measure
(测量)、layout
(布局)和draw
(绘制)。在draw
阶段,View会根据层级递归绘制每个子View,生成一帧完整的画面。 - 这些绘制操作都是通过Canvas进行的,最终会形成一帧“图像数据”。
- 绘制数据传递到Surface
- 在绘制完成后,这些图像数据会被写入到该窗口对应的Surface中。
- Surface是通过SurfaceControl与底层显示服务连接的,应用程序将图像数据填充到Surface的缓冲区中,缓冲区充当一个临时的存储,用于存放绘制好的内容。
- Surface与SurfaceFlinger的交互
- 当绘制数据填充到Surface的缓冲区后,应用会通知系统这个缓冲区已经准备好,可以进行显示。
- 此时,SurfaceFlinger会接收到一个信号,告诉它这个Surface有新的图像数据。SurfaceFlinger会从Surface的缓冲区中获取这帧数据,并将其加入待渲染队列。
- SurfaceFlinger合成图像
- SurfaceFlinger负责把来自不同应用或系统组件的Surface内容合成为一个最终的屏幕显示内容。它会对不同窗口、层级进行合成,计算每个Surface的透明度、遮挡关系等。
- SurfaceFlinger通常会利用GPU对多个Surface进行合成,以确保图像渲染的效率和质量。
- 最终显示到屏幕上
- 合成后,SurfaceFlinger会将完整的图像帧传递给显示驱动程序,驱动程序再将内容呈现到屏幕上。
- 在用户看来,绘制完成的View内容就会显示在设备屏幕上了。
实际应用场景
比如在微信的聊天界面滑动时,View的绘制流程会在每一帧重新计算聊天记录的位置,重新绘制并传递新的图像数据给Surface,最终经过SurfaceFlinger合成后,动态呈现出流畅的滑动效果。
总结:View的绘制通过Canvas生成图像数据,填充到Surface的缓冲区中,再由SurfaceFlinger接收并合成所有窗口的图像,最后显示在屏幕上。这一流程确保了应用界面的流畅渲染和显示效果。