前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Choreographer响应Vsync信号流程

Choreographer响应Vsync信号流程

作者头像
北洋
发布2022-05-06 15:32:23
2890
发布2022-05-06 15:32:23
举报
文章被收录于专栏:北洋csdn

Choreographer中postFrameCallback的调用时机

当下一个Vsync信号来临时,会按照Type取出CallbackQuenes中的链表里面存储的CallBackRecord进行遍历其run方法。

那么什么时机往这个队列中添加回调呢? 在ViewRootImpl中(WMS端收到NativeInputQuene消息回调InputChannel调用到APP端进行ViewRoot分发处理)会调用postFrameCallback方法,这个方法会传入一个FrameCALLback,并将默认使用ANIMATION动画这个回调Type和TOKEN为FRAMETOKEN的token标识来创建一个CallbackRecord并将其添加到对应动画Callback对应的链表中。

在ViewRoot.setView中进行初始化InputChannel和WMS端的InputChannel

流程

ViewRoot的setView方法构造APP端InputChannel对象–>

WindowSession将APP端创建出来的InPUTChannel对象传入到WMS端–>

WMS端进行初始化WMS的InputChannel,申请共享内存并把文件描述符给到APP端的InputChannel对象–>

WMS的InputChannel指向一个fd,而APP端的InputChannel也指向一个fd.这两个后面会进行全双工通信–>

WMS创建两个线程一个ThreadReader读取EventHub(该现场有拦截无用事件的功能并添加到待处理事件队列中),一个ThreadDispatcher用于取出待处理事件队列(对事件进行预处理,设置焦点等)何时进行分发?当上一个事件处理完成之后才会进行分发.(分发过程是将该事件写入到共享内存中,并使用WMS的InputChannel通知APP端的InputChannel【利用初始化时保存的fdpipe通信唤醒】)–>APP端

APP端–>InputChannel从共享内存中拿到事件,InputChannel将事件传递到ViewRoot中,ViewRoot拿着

DecoeView.之后按照Java‘中的事件分发进行处理’

type:这个的用处是下一个Vsync信号来临时,首先会按照TYPE来取出对应的链表,然后进行调用run方法【具体调用哪个方法根据token确定】,接着在取出下一个TYPE如此往复,。固定顺序为:

INPUT 输入处理 Animation,动画处理 Traversal 最终会调用到perfor的measure,layout,draw方法 Commit

token :这个用来表示是否是FrameCallBacl类型的回调还是普通的CallBack,上面的说法其实有点偏,并不是所有CallBack都是调用其run方法,根据其token来决定。

比如这部分讲解的postFrameCallback在Choreographer中会将其转换为FrameCallback的Token和ANIMATION的Callback的type,而像其他的postCallBacl则会具体指定其对应的CallBackType和token是null。

对于FrameCallBacl类型的Callbackl调用其doFrame方法,对于普通的回调CallBacak调用其run方法)【一个很明显的区别是普通的CallBack传入的是一个Runnable最终会调用这个run方法,而对于FrameCallback来说则会调用其doFrame方法。】

对于postFrameCallBack方法的流程图:

【这里提个建议,希望markdown能够支持闪念笔记的流程图格式】

代码语言:javascript
复制
postFrameCallBack方法传入FrameCallback

Choregapher中会将其封装成ANIMATION_Type的Callback和FrameCallback的Token

将其封装成一个CallBackRecord放到对应Type的链表中等待下一个Vsync回调-

Vsync回调来了

按照固定TYPE的顺序取出对应的链表调用CallbackRecord的run方法

CallBackRecord的run方法

取出token发现为FrameCallback__接着回调接口的doFrame方法

由于postFrameCallBack发送的Callback是ANIMATION的类型CallbackRecord,所以doFrame方法是在处理动画过程中进行调用的,在这个方法里面又进行了添加TRAVERSAL的TYPECallbackRecord,并接着再次注册下一个处理动画的回调。 而对于普通的这种比如TRAVERSAL则是必须要指明其对应type类型和token为null,否则默认会是ANIMATION类型并且是FRAMECALLBACLK的token。

本次ANIMATION处理:发送TRAVERSAL和ANIMATON的回调。

image.png
image.png

TRAVERSAL会进入到View的measure,layout,draw方法。Vsync之后会单独拿出一节来讲

ANIMATON会执行动画处理

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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