我们知道Vsync是androiddisplay系统的重要基石,其驱动androiddisplay 系统不断的更新App侧的绘画,并把相关内容及时的更新到LCD上.其包含的主要代码如下:
frameworks\native\services\surfaceflinger\DispSync.cpp
frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp
frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp@DispSyncSource
frameworks\native\services\surfaceflinger\EventThread.cpp
frameworks\native\services\surfaceflinger\MessageQueue.cpp
frameworks\native\libs\gui\BitTube.cpp
frameworks\native\libs\gui\BufferQueueProducer.cpp
- DispSync.cpp
这个class包含了DispSyncThread.是SW-SYNC的心脏.所有的SW-SYNCevent均由其产生.在Android系统中,只有一个DispSync.
- SurfaceFlinger.cpp
这个类主要处理layer的合成.它合成好相关的layer后发送command给HWdisplay 进行进行显示.
- DispSyncSource
Vsync source 在Android系统中有两个instance.一是Vsync-app.另一个Vsync-sf.当SW-SYNC发生时,Vsyncsource 会callback到其相应的EventThread,并且会在Systrace上显示出Vsync-sf和Vsync-app的跳变.
- EventThread.cpp
Vsync event处理线程.在系统中有两个EventThread.一个用于Vsync-app,另一个用于Vsync-sf.其记录App和SurfaceFlinger的requestnextVsync()请求,当SW-VSYNCevent触发时,EventThread线程通过BitTube通知App或SurfaceFlinger.App 开始drawview,SurfaceFlinger 开始合成dirty layer.
- MessageQueue.cpp
MessageQueue 主要处理surfaceflinger的Vsync请求和发生Vsync事件给surfaceFlinger.
- BitTube.cpp
Vsync 事件的传输通道.App或Surfaceflinger首先与EventThread建立DisplayEventConnection(EventThread::Connection::Connection,Connection 是BnDisplayEventConnection子类,BitTube是其dataChannel).App或surfaceFlinger通过call DisplayEventConnection::requestNextVsync()(binder 通信)向EventThread请求Vsyncevent.当EventThread收到SW-VSYNCevent时,其通过BitTube把Vsyncevnet发送给App或SufaceFlinger.
- BufferQueueProducer.cpp
在Vsync架构中,其主要作用是向EventThread请求Vsync-sfevent.当App画完一个frame后,其会把画完的buffer放到bufferqueue中通过call BufferQueueProducer::queueBuffer().进而surfaceflinger进程会通过callDisplayEventConnection:: requestNextVsync()向EventThread 请求Vsync event.
Vsync 流程
App需要draw一个frame时,其会向EventThread(appEventThread) 请求Vysncevent,当EventThread收到Vsyncevent时,EventThread通过BitTueb把Vsyncevent通知到App,同时跳变systrace中的Vsync-app.App收到Vsync-app,开始drawframe.当App画完一个frame后,把画好的内容放到bufferqueue中,就会要求一个Vsync-sfevent,以便surfaceflinger在收到Vsync-sfevent时合成相关的dirty的内容并通知DisplayHW.Display HW 会在下一个HWvsync 时间点,把相关的内容更新到LCD上完成内容的更新.
下面是其大概的流程图,
- (SF-1)APP 画完一个frame以后, 就会把其绘画的buffer放到buffer queue 中.从生产者和消费者的关系来看,App是生产者,surfaceflinger进程是消费者.
- (SF-2)在SurfaceFlinger 进程内,当收到有更新的可用的frame时(需要render到LCD ),就会向EventThread请求Vsync event(requestNextVsync()).EventThread会记录下此请求,当下次Vsync event到来时,便会triggerVsync-sf event.
- DispSync 不断产生SW-VSYNCEVENT.当SW-VSYNCEVENT 产生时,会检查是否有EventListener关心该event(SF 和APP请求Vsync 时会在DispSync中创建EventListener并把其相应的DispSyncSource作为EventListener的callback),如有则调用EventListenercallback(DispSyncSource)的onDispSyncEvent.(callbacks[i].mCallback->onDispSyncEvent(callbacks[i].mEventTime)).
- DispSyncSource会引起Vsync-sf或Vsync-app跳变,当onDispSyncEvent()被调用时,并且会直接调用EventThread的onVSyncEvent().
- EventThread会把Vsync-sf或Vsync-app event通知到App或surfaceFlinger当Vsync-sfevent 产生时(callonDispSyncEvent),surfaceflinger 进程合成dirty layer的内容(SF-5)并通知Display HW 把相关的更新到LCD上.App则在Vsync-ap时开始drawview.
- Display HW 便会在HW 的vsync 到来时,更新LCD 的内容(SF-6).
- 如果有Layer 的内容需要更新,surfaceflinger 便会把相关内容合成在一起,并且通知DisplayHW ,有相关的更新内容.