android源码宇宙-Choreographer

简介: android源码宇宙-Choreographer

Choreographer是什么


Choreographer主要用来申请垂直脉冲信号,指导ViewRootImpl完成屏幕刷新

Choreographer也可以用来监听卡顿,监听的api=postFrameCallback

image.png


源码分析


讲Choreographer要从ViewRootImpl开始讲起

  1. scheduleTraversals是Chorographer工作的起点

应用在requestLayout,invalidate后都会开始调用ViewRootImpl.scheduleTraversals来调度Choreographer

image.png

  1. ViewRootImpl.scheduleTraversals

关于下图中的mTraversalRunnable,它会在适当的时机被Choreographer回调,回调后会依次执行ViewRootImpl.doTraversal方法--> performTraversals。其中performTraversals就是用来处理View中子view 的布局、测量、绘制的。

image.png

  1. Choreographer.postCallback方法

这里就是Choreographer申请垂直脉冲信号的开始

这里代码最终会执行到postCallbackDelayedInternal方法

image.png

  1. Choreographer.postCallbackDelayedInternal

image.png

  1. scheduleFrameLocked方法

以下的方法最终都会调度到scheduleVsyncLocked方法处理

image.png

  1. scheduleVsyncLocked方法

image.png

  1. FrameDisplayEventReceiver.scheduleVsync方法

方法实现在FrameDisplayEventReceiver的子类DisplayEventReceiver中

nativeScheduleVsync用来申请脉冲垂直信号,当下一个信号到来的时候会回调FrameDisplayEventReceiver的onVsync方法

image.png

为什么下一个vsync信号能回调到我们呢?看下图

image.png

  1. 前面的流程讲的实际就是申请vsync信号的流程,下面就到了我们处理vsync信号的逻辑中。

image.png

  1. FrameDisplayEventReceiver.run方法逻辑

image.png

  1. doFrame

image.png

image.png

  1. 上一步的关键方法是doCallbacks,那么我们看看doCallbacks方法的逻辑是如何的

这个方法看完,我们Choreographer刷新的逻辑就完成闭环了。一切看起来不过如此简单而已

image.png

image.png


总结


流程总结描述

Choreographer源码要从ViewRootImpl说起,当我们调用requestLayout或invalidate方法的时候,最终会回调到ViewRootImpl的schedulerTraversal方法,最终经过几次简单调用会调用Choreographer.postCallbacks方法(将TraversalRunnable作为postCallbacks方法参数传入)。

然后Choreographer会去调用底层申请vsync信号,当下一个vsync信号到达的时候,Choreographer会遍历mCallbackQueues中的所有回调类型。最后会回调TraversalRunnable.run方法,后面的逻辑ViewRootImpl会帮助我们完成ui的绘制流程。



相关文章
|
开发工具 Android开发 git
Windows下载android2.2完整源码(转)
Windows下载android2.2完整源码(转)
171 3
|
4月前
|
XML 搜索推荐 Android开发
Android改变进度条控件progressbar的样式(根据源码修改)
本文介绍了如何基于Android源码自定义ProgressBar样式。首先分析了系统源码中ProgressBar样式的定义,发现其依赖一张旋转图片实现动画效果。接着分两步指导开发者实现自定义:1) 模仿源码创建一个旋转动画XML文件(放置在drawable文件夹),修改图片为自定义样式;2) 在UI控件中通过`indeterminateDrawable`属性应用该动画。最终实现简单且个性化的ProgressBar效果,附带效果图展示。
278 2
|
5月前
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码android版环境配置流程及功能明细
部署需基于 CentOS 7.9 系统,硬盘不低于 40G,使用宝塔面板安装环境,包括 PHP 7.3(含 Redis、Fileinfo 扩展)、Nginx、MySQL 5.6、Redis 和最新 Composer。Swoole 扩展需按步骤配置。2021.08.05 后部署需将站点目录设为 public 并用 ThinkPHP 伪静态。开发环境建议 Windows 操作系统与最新 Android Studio,基础配置涉及 APP 名称修改、接口域名更换、包名调整及第三方登录分享(如 QQ、微信)的配置,同时需完成阿里云与腾讯云相关设置。
|
Ubuntu 开发工具 Android开发
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
986 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
|
Java 开发工具 Android开发
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
140 4
|
Java Android开发
Android12 双击power键启动相机源码解析
Android12 双击power键启动相机源码解析
302 0
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
488 1
|
Android开发 Docker 容器
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
2224 1
|
API 开发工具 Android开发
Android源码下载
Android源码下载
1552 0
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
1962 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82

热门文章

最新文章