返回

走近Choreographer,探秘安卓UI绘制幕后的功臣

Android

Choreographer初识(3)

上篇我们介绍到Choreographer去请求Vsync信号,本篇我们接着讲解当收到SurfaceFlinger发来的Vsync信号后是如何去处理的。

当下一个Vsync信号到来后,SurfaceFlinger会把信号发送给Choreographer,然后Choreographer会去唤醒那些被挂起的动画和输入事件,并把它们添加到一个队列中。这个队列叫做Choreographer Queue,它里面存储着所有需要在这一帧中执行的任务。

Choreographer Queue是一个FIFO队列,这意味着先入队的任务会先被执行。Choreographer会依次从队列中取出任务,并把它们交给UI线程去执行。UI线程会根据任务的类型,分别调用不同的方法去处理。

例如,如果任务是动画任务,那么UI线程就会调用View的draw()方法去绘制动画。如果任务是输入事件任务,那么UI线程就会调用View的dispatchTouchEvent()方法去分发触摸事件。

当UI线程把所有任务都执行完成后,这一帧的绘制就结束了。Choreographer会继续等待下一个Vsync信号的到来,然后重复上面的过程。

Choreographer通过这种方式,可以确保动画和输入事件能够在适当的时间被执行,从而保证了安卓系统的流畅度。

Choreographer的作用

Choreographer在安卓系统中起着至关重要的作用,它负责以下几项任务:

  • 协调和管理屏幕刷新。
  • 管理动画和输入事件。
  • 确保动画和输入事件能够在适当的时间被执行。
  • 保证安卓系统的流畅度。

Choreographer的实现原理

Choreographer的实现原理并不复杂,它主要依靠以下几个组件来实现其功能:

  • Vsync信号:Vsync信号是屏幕刷新信号,它由GPU发出。当屏幕需要刷新时,GPU就会发出Vsync信号。
  • Choreographer Queue:Choreographer Queue是一个FIFO队列,它存储着所有需要在这一帧中执行的任务。
  • UI线程:UI线程是安卓系统中的主线程,它负责处理UI相关的所有任务。

Choreographer通过监听Vsync信号来协调屏幕刷新和动画执行。当Vsync信号到来后,Choreographer会把信号发送给UI线程。UI线程收到信号后,会从Choreographer Queue中取出任务,并把它们交给UI线程去执行。

Choreographer通过这种方式,可以确保动画和输入事件能够在适当的时间被执行,从而保证了安卓系统的流畅度。