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



相关文章
|
XML 存储 开发工具
|
9月前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
186 15
十进制与二进制、八进制、十六进制之间的互相转换,本文让你全部理清
十进制与二进制、八进制、十六进制之间的互相转换,本文让你全部理清
1854 0
十进制与二进制、八进制、十六进制之间的互相转换,本文让你全部理清
|
8月前
|
Linux 持续交付 调度
HTTPS 证书自动化运维:https证书管理系统-自动化部署
本指南介绍如何部署Linux服务器节点。首先复制生成的Linux脚本命令,然后将其粘贴到目标服务器上运行。接着刷新页面查看节点记录,并点击“配置证书”选择证书以自动部署。最后,节点部署完成,后续将自动调度,无需人工干预。
HTTPS 证书自动化运维:https证书管理系统-自动化部署
|
存储 物联网 Serverless
玩转 AI 绘图,基于函数计算部署 Stable Diffusion可自定义模型
本文主要将带大家通过使用阿里云产品函数计算 FC 和文件存储 NAS ,快速使用 Stable Diffusion 实现更高质量的图像生成,本方案内置模型库+常用插件+ControlNet ,用户可根据自己的需要更换需要的模型、Lora、增加插件。
69165 27
玩转 AI 绘图,基于函数计算部署 Stable Diffusion可自定义模型
|
7月前
|
存储 前端开发 区块链
基于区块链的慈善捐赠平台:透明与信任的未来
基于区块链的慈善捐赠平台:透明与信任的未来
358 24
|
6月前
|
JSON 测试技术 网络安全
Apifox工具让我的 Socket.IO 测试效率翻倍
用了 Apifox 测试 Socket.IO 后,我整个人都升级了!不仅操作简单到令人发指,功能还贼全面,真的是 提升开发效率的神器 !
|
8月前
|
人工智能 物联网 Python
VMix:即插即用!字节联合中科大推出增强模型生成美学质量的开源适配器,支持多源输入、高质量视频处理
VMix 是一款创新的即插即用美学适配器,通过解耦文本提示和交叉注意力混合控制,显著提升图像生成的美学质量,支持多源输入和高质量视频处理。
299 11
VMix:即插即用!字节联合中科大推出增强模型生成美学质量的开源适配器,支持多源输入、高质量视频处理
|
人工智能 Cloud Native Java
从云原生视角看 AI 原生应用架构的实践
本文核心观点: • 基于大模型的 AI 原生应用将越来越多,容器和微服务为代表的云原生技术将加速渗透传统业务。 • API 是 AI 原生应用的一等公民,并引入了更多流量,催生企业新的生命力和想象空间。 • AI 原生应用对网关的需求超越了传统的路由和负载均衡功能,承载了更大的 AI 工程化使命。 • AI Infra 的一致性架构至关重要,API 网关、消息队列、可观测是 AI Infra 的重要组成。
52929 103
|
SQL JSON 监控
使用 SPL 高效实现 Flink SLS Connector 下推
SLS 推出了 SPL 语言,可以高效的对日志数据的清洗,加工。对 SPL 及 SPL 在阿里云 Flink SLS Connector 中应用进行介绍及举例。
56338 239