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

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

3天内不再提示

Andriod中Vsync的背景

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

Android的显示系统一直使用双缓冲和VSync来防止屏幕画面发生撕裂现象,这也是其他系统的常规操作。Android的不同之处是将VSync运用到绘制系统中,作为黄油计划(Project Butter)的一部分,用以提升系统的流畅度。

VSync:

Android中VSync的作用是统一系统绘制与显示节奏(Apps和SurfaceFlinger),大家各司其职,确保在VSync来的时候干活,这样系统理论上就丝滑了。

如下图,在没有VSync的情况下,系统渲染的节奏与屏幕刷新的节奏不一致,如果某一帧系统渲染的比较晚,那么就会出现屏幕两次刷新都显示同一份内容的情况,也就是Jank(掉帧)。

图片

有了VSync的话,系统会在VSync到来时进行绘制,与屏幕的刷新节奏保持一致,这样就大大降低了jank的概率。

图片

那么问题来了,怎么让Apps根据VSync的节奏来进行绘制呢?App依赖系统的绘制系统,所以必须让绘制系统听命令才行,这就是Choreographer出现的原因。

Choreographer:

Choreographer(编舞者)的作用在源码的注释中已经写得很明白,是用来接收定时脉冲信号来控制绘制的模块。也就是说,有了Choreographer,apps就能够根据Vsync信号来进行周期性的绘制工作。

图片

以上两者配合就基本上完成了Android中VSync的改造,但是还有一个造成Jank的原因也是不容忽视的,这就是双buffer机制带来的jank风险。

Triple Buffer:

如下图,理想情况下的双buffer是没有问题的,这个理想状态是指绘制工作(可以粗略地理解为一帧CPUGPU执行的总耗时)在一个VSync周期内完成,这样的情况下,不会发生jank。

图片

遗憾的是,事情的发展不会总是按我们的预期来进行的,如果绘制时长超过了一个VSync周期,那么就必然会发生jank。如下图所示,有两帧的绘制超过了一个VSync周期,那么就会发生两次Jank。

图片

三Buffer机制实际上就是在上述backbuffer和frontbuffer的基础上,再添加一块buffer进行轮转。在这样的情况下,同样假设有两帧的绘制就是大于一个VSync周期,那么只会造成一次Jank。

图片

三buffer机制虽然能降低jank的概率,但是也会带来Touch响应慢和内存消耗高的负面影响,只不过相对于它带来的效果,这些负面影响被忽略了。

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

    关注

    12

    文章

    3936

    浏览量

    127403
  • 系统
    +关注

    关注

    1

    文章

    1017

    浏览量

    21341
收藏 人收藏

    评论

    相关推荐

    【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次下载

    背景/蒙太奇,背景/蒙太奇是什么意思

    背景/蒙太奇,背景/蒙太奇是什么意思 背景 画面主体背后的景物。背景包括后景、远景
    发表于 04-12 10:26 2031次阅读

    Dragon Board 410c板基于Andriod 5.1,

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

    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 851次阅读

    VSync的起源是什么

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

    VSync的虚拟化与同步

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

    AndriodVSync的分发

    App与SurfaceFlinger是不同的进程,它们之间传递VSync的话涉及到进程间通信,而且VSync频率很高,App很多,所以VSync的分发效率要很高才行。Linux进程间通信方式总共
    的头像 发表于 11-21 16:32 874次阅读
    <b class='flag-5'>Andriod</b><b class='flag-5'>中</b><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 1091次阅读
    <b class='flag-5'>VSync</b> offset定义的方法