前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android--Vsync代码分析(一)

Android--Vsync代码分析(一)

作者头像
用户9732312
发布2022-05-13 20:02:52
5450
发布2022-05-13 20:02:52
举报
文章被收录于专栏:ADAS性能优化

我们知道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上完成内容的更新.

下面是其大概的流程图,

  1. (SF-1)APP 画完一个frame以后, 就会把其绘画的buffer放到buffer queue 中.从生产者和消费者的关系来看,App是生产者,surfaceflinger进程是消费者.
  2. (SF-2)在SurfaceFlinger 进程内,当收到有更新的可用的frame时(需要render到LCD ),就会向EventThread请求Vsync event(requestNextVsync()).EventThread会记录下此请求,当下次Vsync event到来时,便会triggerVsync-sf event.
  3. 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)).
  4. DispSyncSource会引起Vsync-sf或Vsync-app跳变,当onDispSyncEvent()被调用时,并且会直接调用EventThread的onVSyncEvent().
  5. EventThread会把Vsync-sf或Vsync-app event通知到App或surfaceFlinger当Vsync-sfevent 产生时(callonDispSyncEvent),surfaceflinger 进程合成dirty layer的内容(SF-5)并通知Display HW 把相关的更新到LCD上.App则在Vsync-ap时开始drawview.
  6. Display HW 便会在HW 的vsync 到来时,更新LCD 的内容(SF-6).
  7. 如果有Layer 的内容需要更新,surfaceflinger 便会把相关内容合成在一起,并且通知DisplayHW ,有相关的更新内容.
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android性能优化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Vsync 流程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档