渲染机制(三):Vsync信号

一、概述

渲染机制(二):Choreographer 源码解析 文章中,我们说引入 Choreographer 主要是配合 Vsync,给上层 App 的渲染提供一个稳定的 Message 处理的时机,也就是 Vsync 到来的时候,系统通过对 Vsync 信号周期的调整,来控制每一帧绘制操作的时机。其中 Choreographer 是渲染层(App)与 Vsync 沟通的桥梁 ,而 SurfaceFlinger 是合成层与 Vsync 沟通的桥梁。SurfaceFlinger 会在 Vsync 到来的时候,将所有已经准备好的 Surface 进行合成操作。

本文我们来具体探究一下 Vsync 的相关功能。

关联文章:

参考文章:

二、Vsync

产生Vsync信号的方式有两种:硬件(HWC)、软件模拟(VsyncThread) 。

目前的设备基本上都是硬件产生Vsync信号,负责产生硬件 Vsync 的是 HWC,HWC 可生成 VSYNC 事件并通过回调将事件发送到 SurfaceFlinger,DispSync(DispVsyncThread) 将 Vsync 生成由 Choreographer 和 SurfaceFlinger 使用的 VSYNC_APP 和 VSYNC_SF 信号。

关联的线程:

  • EventControlThread 线程:用于开始/关闭 HWComposer HAL的VSYNC。
  • VsyncThread 线程:软件模拟 Vsync信号。
  • DispSyncThread 线程:虚拟化 Vsync信号的线程,将Vsync信号虚拟化成 Choreographer 使用的 VSYNC_APP 信号和 SurfaceFlinger 使用的 VSYNC_SF 信号。
  • EventThread 线程:有两个 EventThread 线程,用于接收 DispSyncThread 发来的VSYNC信号。
    • EventThread(App)线程:用于接收 VSYNC_APP 信号。
    • EventThread(Surface)线程:用于接收 VSYNC_SF 信号。

它们之间的信号传递如下图所示:
在这里插入图片描述

结合上面的信号传递图,App 绘制一帧到屏幕显示的步骤如下:

App 更新界面的完整流程:

-> App 更新界面。
-> App侧向 EventThread(APP) 请求 Vsync-APP 信号。
-> App得到 Vsync-APP 信号后开始构造画面,并将完成后的这些画面发送的SurfaceFlinger线程。
-> SurfaceFlinger 收到画面后向 EventThread(Surface) 请求Vsync-Surface信号
-> SurfaceFlinger 得到Vsync-Surface信号后,SurfaceFlinger开始合成画面。
-> SurfaceFlinger 将合成后的画面放到屏幕对应的 Frame Buffer 中,等待屏幕下次刷新。

下面分别从 App、SurfaceFlinger 两侧详细介绍下执行流程:

APP侧的步骤:

  • step1: App渲染层通过 DisplayEventReceiver.scheduleVsync() 方法向 EventThread(APP) 请求 Vsync-app 信号。
  • step2: EventThread(APP) 继续向 DispSyncThread 提出请求。
  • step3: DispSyncThread 收到 EventThread(APP) 请求后,等待硬件(HWC)或软件(VsyncThread线程) 发送Vsync信号。 硬件(HWC)或软件(VsyncThread线程)会按照固定周期(16.67ms)向 DispSyncThread 线程发送 Vsync 信号
  • step4: DispSyncThread 收到 Vsync 后,休眠offset1(相对与接收到 Vsync信号时的时间偏移),发出 Vysnc-app 信号给 EventThread(APP) 。
  • step5: EventThread(APP) 接收到 Vysnc-app 信号后发送给App 的 DisplayEventReceiver.dispatchVsync() 方法,最终触发UI 线程执行 Choreographer.doFrame() 方法,这个方法里会触发 measure、layout、draw操作(这部分是在CPU进行的)。
  • step6: CPU将数据传递给GPU后会通知 GPU 进行渲染。
  • step7: GPU渲染结束后,会执行swapBuffers操作,并通知SurfaceFlinger进行图层合成。

SurfaceFlinger 侧的步骤:

  • step1: SurfaceFlinger 在收到的通知后(此时已经获取到了App侧待合成图层数据),向EventThread(Surface) 发出请求 Vsync-sf 信号。
  • step2: EventThread(Surface) 再向 DispSyncThread 请求 Vsync-sf 信号。
  • step3: DispSyncThread 收到 EventThread(Surface) 请求后,等待硬件(HWC)或软件(VsyncThread线程) 发送Vsync信号。
  • step4: DispSyncThread 收到 Vsync 后,休眠offset2,发出 Vsync-sf 信号给 EventThread(Surface) 。
  • step5: EventThread(Surface) 接收到 Vysnc-sf 信号后开始合成图层。
  • step6: SurfaceFlinger 将合成好的数据放到屏幕对应的 Frame Buffer 中,等待屏幕的刷新。当屏幕刷新时,即可看到最新的UI画面。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值