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

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

3天内不再提示

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

jf_78858299 来源:北洋洋洋 作者:北洋 2023-02-02 11:18 次阅读

VSync信号

vsync是有两个信号的,

一个是vsync-app用于生成当前帧的数据;(CPU计算和GPU渲染)

一个用于消费数据(合成图像到Display上,vsync-surface) 。

三缓冲机制:

❝CPU缓存为了防止GPU计算超时,提前生成数据 GPU:将数据放到缓冲池防止屏幕渲染超时

一,vsync信号来源

vsync可以由底层HardWare提供经由Display发送,当底层Hardware不能提供时也会发送vsync信号到Display。vsync屏蔽了底层Hal,使得没有Vsync的硬件也可以使用。

二,发送流程

HardWare到达Display之后,Display会 「将vsync信号分成两个」 一个用于 「生成」 一个用于 「消费」 的vsync信号。

「一个是vsync-app」 唤醒Chrographer做App的绘制操作(生成当前帧数据)

「一个是vsync-sf」 是SurfaceFliger使用,当vsync信号来临时进行合成操作(要满足消费完上一帧数据的条件下)

三,偏移量

vsync每隔16ms发送一个。vsync会分成两个信号发送。这就意味着只要这两个信号在16ms之内处理完数据就可以。也就是说我们可以打乱顺序是 「先合成消费帧数据绘制到屏幕上」 还是先 「生成帧数据」

比如先发送vsync-app在0-13ms做完处理,接着13-16ms在发送vsync-surface合成数据 或者颠倒,但是事件一定保证只要在16ms之内处理完这两个信号即可

四,整个处理过程:

1.vsync-app:UI Thread准备好绘制指令,提交给Render Thread渲染线程去调用OpenGl的函数去生成buffer并放到BufferQuene中

2.vsync-surface:SurfaceFliger进程去BufferQuene中去取出buffer合成图像显示到屏幕Display中。

五,vsync-app 解释

唤醒Chorgrapher去做处理生成当前这一帧的数据。注意:有两个线程共同合作完成绘制动作:UIThread生成指令和RenderThread调用OpenGl库生成Buffer放入到BufferQuene缓冲队列中。 「UIThread」 :Choreographer.doFrame() 「RenderThread」 :DrawFrame

首先来讲 「UIThread的Choreographer.doFrame」 方法:

1.按顺序发送INPUT,ANIMATION,TRASVEL并处理他们各自的doFrame方法 先处理输入事件在处理动画,最后的TRASVEL会进行调用到ViewRootImpl中的doTrasvel回调,这个回调里面会进行measure,layout和draw。

这里讲下draw方法,进行performDraw方法调用时会调用全局Surface(也就是activity)的lockCanvas方法。这个方法会在native层的Surface对象中锁定一块内存区域返回值为canvas也就是这片在native层的Surface内存空间中。接下来调用draw方法把这个canvas传入到参数中,也就是我们在draw方法中对canvas进行的修改实质上都是对这块内存区域的修改。最后draw方法调用完成后,会进行释放这块内存区域并交给RenderThread去处理渲染数据。(释放的操作在native层对应的处理是把这块内存区域变成一个Bitmap交由RenderThread去渲染)

❝draw方法其实并没有进行真正的绘制,而是把绘制的内容放入到了DisplayList中接着同步到RenderThread中。

绘制最终会调用到View.invalidate方法

2.RenderThread执行的时候UIThread就可以释放掉去做其他处理,接着RenerThread去取出DisplayList中的数据进行处理生成frameBuffer给到Surface去做合成处理。具体流程:RenderThread会执行一个DrawFrameTask的Task,里面核心方法是DrawFrame。通过OpenGl和一些库将渲染数据通知给SurefaceFliger去做图层合成。将渲染数据放入到阻塞队列中

六,vsync-sf:

App端中RenderThread产生的FrameBuffer数据会在SurfaceFliger中进行消费。也就是取出阻塞队列中的渲染数据。SurfaceFliger进行合成到Display上面处理

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

    关注

    68

    文章

    10794

    浏览量

    210662
  • 编程
    +关注

    关注

    88

    文章

    3556

    浏览量

    93520
  • 渲染
    +关注

    关注

    0

    文章

    69

    浏览量

    10900
收藏 人收藏

    评论

    相关推荐

    plc教程之浏览FactoryTalk View Studio

    点击“Samples Water”。plc视频教程是比较宏观的,里面包含的内容很是庞大,plc教程之浏览FactoryTalk View Studio只是其中的很小的一部分更多内容可以参看wxdongtian.cn网站的其他文章,或者购买全套的教程。
    发表于 09-18 08:45

    JAVA教程之常用图形的绘制与填充

    JAVA教程之常用图形的绘制与填充,很好的JAVA的资料,快来学习吧
    发表于 04-11 17:28 3次下载

    JAVA教程之不规则图形的绘制

    JAVA教程之不规则图形的绘制,很好的JAVA的资料,快来学习吧
    发表于 04-11 17:28 1次下载

    C#教程之绘制鼠标Cur

    C#教程之绘制鼠标Cur,很好的C#资料,快来学习吧。
    发表于 04-20 10:50 6次下载

    C#教程之绘制文字

    C#教程之绘制文字,很好的C#资料,快来学习吧。
    发表于 04-20 10:50 8次下载

    C#教程之绘制选中

    C#教程之绘制选中,很好的C#资料,快来学习吧。
    发表于 04-20 10:50 10次下载

    C#教程之绘制噪点

    C#教程之绘制噪点,很好的C#资料,快来学习吧。
    发表于 04-20 10:50 23次下载

    C#教程之绘制直线

    C#教程之绘制直线,很好的C#资料,快来学习吧。
    发表于 04-20 10:50 6次下载

    C#教程之图片上绘制文字

    C#教程之图片上绘制文字,很好的C#资料,快来学习吧。
    发表于 04-20 11:13 5次下载

    自动控制系统控制工程教程之信号流程图的资料说明

    本文档的主要内容详细介绍的是自动控制系统控制工程教程之信号流程图的资料说明。系统方块图直观表示系统输入与输出的关系,但简化过程复杂。
    发表于 11-22 08:00 5次下载
    自动控制系统控制工程教<b class='flag-5'>程之</b><b class='flag-5'>信号</b><b class='flag-5'>流程</b>图的资料说明

    简述dtft和z变换之间关系

    简述dtft和z变换之间关系 离散时间傅里叶变换(DTFT)和Z变换是两种在信号处理中非常常见的变换方法。虽然两种变换之间存在一些区别,但
    的头像 发表于 09-07 16:38 3315次阅读

    Andriod中Vsync的背景

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

    VSync的虚拟化与同步

    。那怎么办呢? 因此,最好是有一个模块去专门跟驱动沟通,再由它将VSync信号广播给大家,就像一个hub一样。但是VSync频率这么高,每次从kernel到userspace的消耗也不少,而且
    的头像 发表于 11-21 16:23 606次阅读
    <b class='flag-5'>VSync</b>的虚拟化与同步

    Andriod中VSync的分发

    VSync驱动,具体来说就是App的每一帧的绘制是从收到VSync信号VSync-app)开始的,SurfaceFlinger合成当前图层
    的头像 发表于 11-21 16:32 764次阅读
    Andriod中<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定义的方法