Vsync信号上报流程
Vsync的注册函数,来临时会回调HWComposer的hook_VSYNC方法,接着调用到vsync方法中
大致流程梳理:
该方法会通知给SurfaceFliger的onVsyncReceived方法,接着调用DispSync的addResyncSample方法。
DispSyncThread线程被唤醒 ,接着EventThread线程唤醒,上面代码中会遍历singalConnections集合调用Connection的postEvent方法
由于上面卡到了DispSync类调用addResyncSample方法处,故先来看这个类。
DispSyncThread线程
DisSync类会创建一个DispSyncThread并运行其run方法
DispSync的初始化过程:
- 运行DispSyncThread线程,用于收集等待Vsync信号的对象并回调这些对象的onDispSyncEvent方法
- 这些等待的对象其实就是DispSyncSource对象 , 是在创建两个EventThread接收的参数
- DispSyncSource的onDispSyncEvent方法阻塞于mCond(Condition)的wait等待被唤醒。
接着分析addResyncSample方法
此时进入到EventThread线程中
Connection::postEvent
像Bittube发送消息,Looper监听到后发送消息切换到SurfaceFlinger主线程去处理
#### ,MQ::cb_eventReceiver
init初始化过程中MQ会监听BitTube,从而调用到cb_eventReceiver方法
**大致流程**:
发送消息(REFRESH消息),接着就是图形渲染的过程了。
**发送消息代码:**
SurfaceFlinger处理消息
流程梳理
- HWComposer接受Vsync信号,
- 唤醒DispSyncThread线程(用于接受Vsync信号),
- 唤醒EventThread线程,调用到DisplayEventReceiver的sendEvent方法再通过BitTube来发送数据
- EventThread创建好后会调用MQ的setEventThread方法监听Bittube,调用MQ的方法因此回调到SurfaceFlinger的主线程中处理
- 进入到渲染流程下篇文章分析
原文链接:SurfaceFliger与Vsync信号如何建立链接? - 掘金 (juejin.cn)