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会执行动画处理



目录
相关文章
|
6月前
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
使用信号集,验证可靠信号挨个排队响应和不可靠信号会丢失的特点
使用信号集,验证可靠信号挨个排队响应和不可靠信号会丢失的特点
|
6月前
|
监控 安全 持续交付
【专栏】Webhook是服务器主动发送事件通知的机制,打破传统客户端轮询模式,实现数据实时高效传递。
【4月更文挑战第29天】Webhook是服务器主动发送事件通知的机制,打破传统客户端轮询模式,实现数据实时高效传递。常用于持续集成部署、第三方服务集成、实时数据同步和监控告警。具有实时性、高效性和灵活性优势,但也面临安全风险和调试挑战。理解并善用Webhook能提升系统性能,广泛应用于现代软件开发和集成。
433 0
|
6月前
|
存储 JavaScript Java
响应系统的作用与实现(上)
响应系统的作用与实现
87 0
|
6月前
|
缓存 调度
响应系统的作用与实现 (下)
响应系统的作用与实现
69 0
|
弹性计算 应用服务中间件 Shell
使用WaitCondition与WaitConditionHandle进行信号通知
本场景主要介绍使用ALIYUN::ROS::WaitCondition与ALIYUN::ROS::WaitConditionHandle进行信号通知。
通信电子线路实验-调幅模块仿真(发送与接收)(二)
通信电子线路实验-调幅模块仿真(发送与接收)(二)
226 0
通信电子线路实验-调幅模块仿真(发送与接收)(二)
通信电子线路实验-调幅模块仿真(发送与接收)(一)
通信电子线路实验-调幅模块仿真(发送与接收)(一)
241 0
通信电子线路实验-调幅模块仿真(发送与接收)(一)
|
移动开发 缓存 物联网
串口接收并处理数据流程|学习笔记
快速学习串口接收并处理数据流程
串口接收并处理数据流程|学习笔记
|
数据采集 异构计算
FPGA-串口通信的接收模块(发送接收模块)
FPGA-串口通信的接收模块(发送接收模块)
219 0
下一篇
无影云桌面