0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Andriod中VSync的分发

麦辣鸡腿堡 来源:OPPO内核工匠 作者:Phil 2023-11-21 16:32 次阅读

App与SurfaceFlinger是不同的进程,它们之间传递VSync的话涉及到进程间通信,而且VSync频率很高,App很多,所以VSync的分发效率要很高才行。Linux进程间通信方式总共就那么几种,Android选择了Domain Socket,应该是因为其高效、简单、且有序吧,并将其封装成了更易用的BitTube。

图片

VSync-app/sf

Android绘制、显示各个环节均是由VSync驱动,具体来说就是App的每一帧的绘制是从收到VSync信号(VSync-app)开始的,SurfaceFlinger合成当前图层也是从收到VSync信号(VSync-sf)开始的。为了避免浪费,VSync的分发是按需的,即只有用户需要(requestNextVsync)的时候,DisplayVSync才会给它发送VSync。

图片

Vsync相关类简介

首先来介绍一些vsync相关的类,基本上所有vsync相关方法,都是实现在这三个类当中的(以下代码均为Anrdoid T版本源码)。

VsyncTracker:其实际上是创建了一个VSyncPredictor对象,这个对象的作用是基于之前的VSync信号时间戳来预测未来VSync时间戳。也就是基于HWVsync来训练Vsync模型。从而能够在HWVsync关闭的情况下依然能够预测未来的VSync时间。

图片

VsyncDispatcher:顾名思义,这个类是用来分发Vsync信号的。实际上最终创建了一个VSyncDispatchTimerQueue对象,负责分发vsync callback事件,需要接收Vsync事件的模块可以通过registerCallback向其中注册回调,当有Vsync事件发生时就会遍历已注册的回调分发Vsync。

图片

VSyncController:最终方法的实现是在一个VSyncReactor对象中,从代码中看,这个对象的主要作用是负责传递HWVsync,presentFence信号。

图片

sf申请vsync

当sf需要请求刷新时,会调用MessageQueue中的scheduleFrame函数

图片

进而直接调用到VSyncCallbackRegistration中的schedule函数,进一步再到VSyncDispatchTimerQueue中的schedule函数。

图片

图片

这其中rearmTimerSkippingUpdateFor是一个比较关键的函数,这个函数会拿到下次触发vsync的时间戳,并通过setTimer函数向定时器设置这个时间戳,等到定时器被唤醒时,触发callback以发送vsync。

图片图片

下面我们来看callback是怎么被层层触发的。

当定时器到来时,首先回调的是VSyncDispatchTimerQueue中的timerCallback函数

图片

它持有的结构体Invocation中持有一个VSyncDispatchTimerQueueEntry对象,进一步追下去,可以知道这个mCallback最终调到的是MessageQueue中的VsyncCallback函数。

图片图片图片

最后的这个红框的部分,就是我们通常在trace里看到的vsync-sf跳变的地方啦!

图片

app申请vsync

相比于sf的申请,app的申请就显得要复杂一些。app通常是通过调用requestNextVsync这个binder接口来进行vsync的申请。

图片

这个接口会调用到eventthread中的requestNextVsync函数,此函数会通过mCondition发送广播。

图片

当threadMain监听到广播后,便会继续执行循环。

图片

eventThread会执行什么呢,关键性的函数就是dispSyncSource中的setVSyncEnabled函数,当传入参数为true时,会调用到CallbackRepeater中的start函数。

图片图片

继续往下看,会调用到VSyncCallbackRegistration中的Schedule函数,进一步到VSyncDispatchTimerQueue中的schedule函数。

图片图片

下面的流程和sf申请vsync基本就是大同小异了,它回调的地方是这里

调用CallbackRepeater中的callback;

图片

最终调用到DispSyncSource中的onVsyncCallback,这也就是我们在trace中看到的vsync-app跳变的地方啦。

图片

相比于vsync-sf,vsync-app还多了一个向申请方发送vsync的过程。继续往下看,调用到了EventThread中的onVSyncEvent,其会把VsyncEvent保存到mPendingEvents中。

图片

那么这些event在哪里分发呢?答案是还在threadMain中,这个dispatchEvent函数就是用来负责向每个consumer分发vsync的。

图片

说到这里,大家肯定会有一个疑问,为什么vsync-app和vsync-sf都是由同一个定时器触发的,但是最终回调的位置确不一样呢?

答案是,这两种vsync本身注册回调的位置就不一样。

vsync-sf是在messagequeue中注册的

图片

而vsync-app是在callbackRepeater中注册的。

图片

这也是google在Android T上才做出来的改动,究其原因,应该是谷歌认为应该简化vsync-sf在内部的传递流程,反正也是只给sf自己用的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3911

    浏览量

    126990
  • 定时器
    +关注

    关注

    23

    文章

    3228

    浏览量

    114254
  • 函数
    +关注

    关注

    3

    文章

    4273

    浏览量

    62290
收藏 人收藏

    评论

    相关推荐

    【Raspberry Pi 3申请】andriod系统开发APP

    申请理由:公司项目前期测试项目描述:主要功能能够实现andriod系统,在这个基础之上开发一些小的APP功能,通过有线网络或者无线网络与其他设备或者网页进行通信等等。
    发表于 04-05 13:50

    智讯系列培训课程:Andriod事件、数据、网络

    现将智讯专业资料《Andriod事件、数据、网络》分享给大家,仅供参考交流! 智讯(武汉)科技有限公司在移动互联网、物联网、嵌入式等技术领域有近十年的积累,专业为高校电子类、物联网工程、嵌入式、软件工程等高校院系提供实验室设
    发表于 08-18 10:03

    如何在和声图形管理器设置HSYNC,VSYNC和DE的引脚?

    嗨,所有,和谐图形管理器的“显示设置”选项卡上的每个按钮的水平脉冲,垂直脉冲和数据启用,说“见/改变引脚”。按下按钮显示引脚表。我想我可以找到HSYNC,VSYNC,DE下的PMP部分,但没有。我想
    发表于 09-29 16:04

    如何驾驶所有五个R,G,B,HSYNC和VSYNC

    你好我打算在sp605实现sobel边缘检测(我有这个开发板)我想去寻找简单的vga驱动程序我可以将R,G,B和HSYNC连接到J55可用的四个I / O,但不能连接VGA所需的VSYNC,因为J55只有四个I / O.请建
    发表于 10-29 08:13

    logcat如何查看Andriod log系统日志?

    logcat会输出系统哪些信息呢?如何学习logcat命令?logcat如何查看Andriod log系统日志?如何查看Andriod log系统日志?
    发表于 03-03 06:15

    VSYNC、HSYNC、DOTCLOCK是如何计算的?

    与 LCDIFv2。 这是唯一的变化吗-VIDEO_MUX->VID_MUX_CTRL.SET = VIDEO_MUX_VID_MUX_CTRL_PARA_LCD_SEL_MASK;VSYNC、HSYNC、DOTCLOCK 是如何计算的?
    发表于 03-14 09:42

    三星手机andriod系统软件

    三星手机andriod系统软件
    发表于 01-14 14:58 18次下载

    Dragon Board 410c板基于Andriod 5.1,

    Dragon Board 410c板基于Andriod 5.1,Linux,Windows10三种操作系统开发特点介绍,我上传了很多相关资料,感兴趣的可以去我上传的资料里看看哈。
    发表于 06-30 15:03 4次下载

    区块链分发平台Huobi Info公测版已正式上线

    新加坡,火币旗下区块链行业内容分发平台——Huobi Info(火币资讯)公测版全新上线,提供ios、andriod版本供用户下载,可向媒体、机构和个人用户提供7×24小时区块链信息服务。
    发表于 11-07 11:38 1.1w次阅读

    Andriod Phone通过蓝牙控制的机器人汽车

    电子发烧友网站提供《由Andriod Phone通过蓝牙控制的机器人汽车.zip》资料免费下载
    发表于 11-11 14:48 0次下载
    由<b class='flag-5'>Andriod</b> Phone通过蓝牙控制的机器人汽车

    简述Vsync信号和View绘制流程之间的关系

    vsync是有两个信号的, 一个是vsync-app用于生成当前帧的数据;(CPU计算和GPU渲染) 一个用于消费数据(合成图像到Display上,vsync-surface) 。
    的头像 发表于 02-02 11:18 807次阅读

    VSync的起源是什么

    VSync的起源 显示屏上一帧画面的显示过程,是像素自上而下逐行扫描的过程,如果在上一帧的扫描还没有结束的情况下,屏幕又开始扫描下一帧的像素,那么就会出现如下图中撕裂(tearing)的情况。 这个
    的头像 发表于 11-21 16:01 1101次阅读
    <b class='flag-5'>VSync</b>的起源是什么

    AndriodVsync的背景

    Android的显示系统一直使用双缓冲和VSync来防止屏幕画面发生撕裂现象,这也是其他系统的常规操作。Android的不同之处是将VSync运用到绘制系统,作为黄油计划(Project
    的头像 发表于 11-21 16:13 296次阅读
    <b class='flag-5'>Andriod</b><b class='flag-5'>中</b><b class='flag-5'>Vsync</b>的背景

    VSync的虚拟化与同步

    VSync的虚拟化 由上面的介绍可以知道,VSync其实起源于显示屏,但是想想如果每个App和SurfaceFlinger都去从硬件驱动中直接监听VSync,那未免有点太复杂了,而且耦合性太高,不行
    的头像 发表于 11-21 16:23 606次阅读
    <b class='flag-5'>VSync</b>的虚拟化与同步

    VSync offset定义的方法

    ,可以看到,每一个vsync-app都比对应的TE信号晚了1.2ms,因此这份trace的app-offset为+1200000(ns为单位) 同样的,每一个vsync-sf都比对应的TE早了3.6ms,因此sf-offset
    的头像 发表于 11-21 16:57 906次阅读
    <b class='flag-5'>VSync</b> offset定义的方法