Choreographer响应Vsync信号流程

简介: Choreographer响应Vsync信号流程

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能够支持闪念笔记的流程图格式】

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的回调。

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

ANIMATON会执行动画处理



目录
相关文章
|
2月前
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
|
2天前
|
监控
LabVIEW与串口通讯在运行一段时间后出现数据接收中断的问题
LabVIEW与串口通讯在运行一段时间后出现数据接收中断的问题
使用信号集,验证可靠信号挨个排队响应和不可靠信号会丢失的特点
使用信号集,验证可靠信号挨个排队响应和不可靠信号会丢失的特点
|
2月前
|
Python
【需求响应】一种新的需求响应机制DR-VCG研究
【需求响应】一种新的需求响应机制DR-VCG研究
【需求响应】一种新的需求响应机制DR-VCG研究
|
2月前
|
缓存 调度
响应系统的作用与实现 (下)
响应系统的作用与实现
50 0
|
2月前
|
存储 JavaScript Java
响应系统的作用与实现(上)
响应系统的作用与实现
62 0
|
10月前
|
弹性计算 应用服务中间件 Shell
使用WaitCondition与WaitConditionHandle进行信号通知
本场景主要介绍使用ALIYUN::ROS::WaitCondition与ALIYUN::ROS::WaitConditionHandle进行信号通知。
62 0
|
12月前
|
Windows
连续时间系统的冲激响应和零状态响应
连续时间系统的冲激响应和零状态响应
178 0
|
12月前
|
JSON PHP 数据格式
响应 方式
响应 方式
|
前端开发

热门文章

最新文章