Android编舞者类Choreographer小结

作用

编舞者类的作用主要是控制绘制节奏,用于发起一次vsync垂直同步信号的监听,当垂直同步信号来的时候会回调注册的Runnable或者FramCallback

Choreographer对象获取

Choreographer对象是通过它的getInstance方法获取实例,虽然看名字是单例,但是它是保存在ThreadLocal中,每个线程都会有一个唯一的实例,而不是全局单例

同步信号请求过程

  1. ViewRootImplscheduleTraversals方法中,会先设置一个同步屏障,然后调用编舞者类的postCallback方法发起一次请求同步信号

    1. postCallback和postFrameCallback的区别主要在于请求的垂直同步信号的类型不同;postFrameCallback请求的类型是animation回调的对象类型是FrameCallback,而postCallback可以自定义传入任何类型的垂直同步信号,执行的回调对象类型是Runnable
  2. 编舞者类会把这个Callback根据类型和时间的先后顺序保存到队列中,队列的实现方式是单链表结构;Callback的类型有五种:input、animation、inserts_animation、traversal、commit

  3. 然后判断当前线程是否主线程,如果不是的话则通过Handler发送消息到主线程去执行,如果是主线程,则立刻调用native方法发起一次同步信号请求

  4. 当垂直同步信号来的时候,会回调响应的方法,最后会调用doFrame方法去处理垂直同步信号

  5. 在doFrame方法里面

    1. 先根据当前时间减去垂直同步信号的时间计算时间差,判断有没有跳帧,如果有跳帧并且超过30帧,则打印Log,并且会重新计算当前帧的绘制时间;

    2. 如果计算后当前帧的时间小于上一次帧绘制时间,则会重新发起一次垂直同步信号请求

    3. 接着从五个队列中,依次取出各个Callback并调用相应方法,Runnable调用run方法,FrameCallback调用doFrame方法

  6. 接着ViewRootImpl就开始调用doTraversal->performTraversal->performMeasure->performLayout->performDraw开始绘制

问答

  • Q: 我们都知道Android的刷新频率是60帧/秒,这是不是意味着每隔16ms就会调用一次onDraw方法?

A: 不是,只有当界面需要刷新,并且编舞者请求的垂直同步信号到达时才会调用

  • Q: 如果界面不需要重绘,那么还16ms到后还会刷新屏幕吗?

    A: 会的,但是刷新的是旧的数据

  • Q: 我们调用invalidate()之后会马上进行屏幕刷新吗?

    A: 不会的,需要等待下一次垂直同步信号才会刷新

  • Q: 我们说丢帧是因为主线程做了耗时操作,为什么主线程做了耗时操作就会引起丢帧

    A:因为垂直同步信号是由底层发出的,而且发出的时间间隔是一样的,如果主线程做了耗时操作,会导致编舞者类接收到垂直同步信号的时间比较晚,界面就不能及时刷新,从而引起丢帧和界面卡顿

  • Q: 如果在屏幕快要刷新的时候才去OnDraw()绘制,会丢帧吗?

    A: 不会,屏幕刷新也是跟着垂直同步信号走的,当垂直信号到了的时候才会触发onDraw方法绘制,跟丢帧没有关系

Android编舞者类Choreographer小结相关推荐

  1. android 编舞者的使用

    android 编舞者的使用 1 编舞者Choreographer 的基本常识可以参考其他的博主,在这里主要是针对我使用的时候理解的,请取其精华即可. 使用编舞者 Choreographer 主要是在 ...

  2. Choreographer ——编舞者

    Choreographer(编舞者) 官方解释 /*** Coordinates the timing of animations, input and drawing.* <p>* Th ...

  3. Android黄油计划之Choreographer原理解析

    搞客户端开发,时间也有点了,但是每次想起来,总感觉自己掌握的东西零零散散,没有一点集在的感觉,应用层的懂,framework的也懂,框架啥的了解一点,分层的思想也有一些,JVM的原理啊,内存分配和管理 ...

  4. android 实现自定义监听接口,Android在自定义类中实现自定义监听器方式

    Android在自定义类中实现自定义监听器方式 发布时间:2020-08-31 06:19:39 来源:脚本之家 阅读:203 作者:Simon_Qi 监听器可以说是Android开发中最常用的东西之 ...

  5. android动画送礼物,Android仿直播类app赠送礼物功能

    直播界面 实现的是播放本地的视频文件: /** * 直播界面,用于对接直播功能 */ public class LiveFrag extends Fragment { private ImageVie ...

  6. Android编程之SparseArrayE详解 Android编程之SparseArrayE详解

    Android编程之SparseArray<E>详解 分类:Android2012-09-01 13:139412人阅读评论(5)收藏举报 android编程delete存储list 最近 ...

  7. Android 自定义组合控件小结

    Android 自定义组合控件小结 引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控 ...

  8. 基于sqlite的android数据库编程,Android编程之SQLite数据库操作方法详解

    Android编程之SQLite数据库操作方法详解 发布时间:2020-09-07 12:33:04 来源:脚本之家 阅读:85 作者:低调小一 本文实例讲述了Android SQLite数据库操作方 ...

  9. android application 全局变量 空指针,Android编程之Application设置全局变量及传值用法实例分析...

    本文实例讲述了Android编程之Application设置全局变量及传值用法.分享给大家供大家参考,具体如下: /** * 重写Application,主要重写里面的onCreate方法,就是创建的 ...

最新文章

  1. SDK与IDE的选择(附上设置默认SDK)
  2. PHP实现页面跳转的几种方法
  3. java 画砖块,钢笔画入门:教你画砖块
  4. 华为5G设备全球分布图曝光:欧洲占总量近6成;地平线发布首款车规级AI芯片,名叫征程2.0;奥迪与比亚迪达成电池供货协议……...
  5. 计算机论文哪儿找,查找关于计算机毕业论文.docx
  6. Android两个子线程之间通信
  7. 【JWT】JWT+HA256加密 Token验证
  8. Deep learning-based CSI Feedback for Beamforming 2
  9. 线性相位FIR数字滤波器的时域和频域特性
  10. python增量爬虫_python网络爬虫——增量式爬虫
  11. 哲学必读10本经典著作
  12. 常见高清视频“扩展名”、视频标准
  13. 从鼠标点击位置发射射线检测是否点击到3D世界中的物体
  14. 四则运算之结对作业报告
  15. git提交代码出现 fatal: The remote end hung up unexpectedly-错误处理
  16. 【论文阅读】【综述】从Optical Flow到Scene Flow
  17. java冒泡排序打印实时动态图(借鉴+改动)
  18. php redis 批量读取,PHP redis 批量操作
  19. 自学软件测试好找工作吗?
  20. 由蓝眼睛岛问题引发的思考

热门文章

  1. 微信小程序在特殊机型上崩溃的问题
  2. 【小熊派bearpi】HarmonyOS设备开发上手
  3. C语言——结构体struct与typedef的使用
  4. 【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)
  5. Python大学排行榜
  6. ESP32-CAM带OV2640摄像头视频显示
  7. 16小时讲完,Spring源码解析整套笔记
  8. 认识P2V(虚拟化与云技术)
  9. Unity ShareSDK接入QQ登陆微信登陆
  10. day08代码操纵xls文档