简述View 的绘制是如何把数据传递给 SurfaceFlinger 的 ?

在Android系统中,View的绘制过程是通过一系列步骤将显示内容最终传递给SurfaceFlinger,SurfaceFlinger再负责将这些内容显示到屏幕上。这个过程主要涉及应用层的View绘制系统层的SurfaceFlinger处理。下面逐步解析这一过程:

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

实际应用场景

比如在微信的聊天界面滑动时,View的绘制流程会在每一帧重新计算聊天记录的位置,重新绘制并传递新的图像数据给Surface,最终经过SurfaceFlinger合成后,动态呈现出流畅的滑动效果。

总结:View的绘制通过Canvas生成图像数据,填充到Surface的缓冲区中,再由SurfaceFlinger接收并合成所有窗口的图像,最后显示在屏幕上。这一流程确保了应用界面的流畅渲染和显示效果。

发表评论

后才能评论