Android 进阶——图形显示系统之Choreographer监听VSync并提供回调接口详解(二)

文章目录

  • 引言
  • 一、Choreographer 信号的分发处理
  • 二、Choreographer.FrameDisplayEventReceiver # onVsync方法向主线程发送Message消息
  • 三、主线程Looper处理消息并触发Choreographer.FrameDisplayEventReceiver.run方法
  • 四、Choreographer#doFrame处理回调
    • 1、Choreographer#doFrame方法处理VSync消息执行四种回调事件
    • 2、Choreographer#doCallbacks方法处理四种回调事件
    • 3、CallbackRecord #run方法响应VSync信号
  • 五、Choreographer#postFrameCallback()

引言

前一篇文章 Android 进阶——图形显示系统之VSync和 Choreographer的创建详解(一)介绍了关于Android VSync信号产生和基本管理以及Choreographer创建的过程,由于篇幅问题,把应用进程接到VSync 信号后如何处理留到了本篇文章,如果还没有阅读过上一篇建议先去阅读,系列文章:

  • Android 进阶——图形显示系统之VSync和 Choreographer的创建详解(一)
  • Android 进阶——图形显示系统之Choreographer监听VSync并提供回调接口详解(二)

一、Choreographer 信号的分发处理

书接上文Choreographer 在创建的过程不仅仅是完成自身对象的创建(一个线程拥有自己独立的副本)更重要的是完成了一个VSync 监听处理模型的初始化,还是从上篇的接到VSync信号后就会回调Java层DisplayEventReceiver#onVsync方法

    // Called from native code.@SuppressWarnings("unused")private void dispatchVsync(long timestampNanos, int builtInDisplayId, int frame) {onVsync(timestampNanos, builtInDisplayId, frame);}

二、Choreographer.FrameDisplayEventReceiver # onVsync方法向主线程发送Message消息

        @Overridepublic void onVsync(long timestampNanos, int builtInDisplayId, int frame) {//是否支持处理副屏的VSync信号if (builtInDisplayId != SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN) {Log.d(TAG, "Received vsync from secondary display, but we don't support "+ "this case yet.  Choreographer needs a way to explicitly request "+ "vsync for a specific display to ensure it doesn't lose track "+ "of its scheduled vsync.");scheduleVsync();return;}// Post the vsync event to the Handler.long now = System.nanoTime();mTimestampNanos = timestampNanos;mFrame = frame;//传给Message的Callback 对象为FrameDisplayEventReceiver自身并发送异步消息,即本身作为runnable传入msg, 发消息后会走run(),即doFrame(),也是异步消息Message msg = Message.obtain(mHandler, this);msg.setAsynchronous(true);//@link Choreographer 构造函数初始化的全局FrameHandler对象mHandlermHandler.sendMessageAtTime(msg, timestampNanos / TimeUtils.NANOS_PER_MS);}

即onVsync()过程是通过FrameHandler向主线程Looper发送了一个自带Callback(即FrameDisplayEventReceiver)的消息,

三、主线程Looper处理消息并触发Choreographer.FrameDisplayEventReceiver.run方法

又FrameDisplayEventReceiver实现了Runnable接口,当主线程Looper执行到该消息时,则调用FrameDisplayEventReceiver.run()方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/71770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Windows注册表内容详解】

Windows注册表内容详解 第一章节 注册表基础 一、什么是注册表 注册表是windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”,也可以说是一个非常巨大的树状分层结构的数据库系统。 注册表记录了用户安装在计算机上的软件和每个程…

企业网络小实验-MUX-Vlan(NAT)

路漫漫其修远兮,吾将上下而求索 直接上实验 实验说明 模拟公司的部门实验, (1)公司主机如图所示,配置DNS服务器,配置NAT地址转换(使用easy-ip的形式)访问外网。 (2&…

【性能测试】Jenkins+Ant+Jmeter自动化框架的搭建思路

前言 前面讲了Jmeter在性能测试中的应用及扩展。随着测试的深入,我们发现在性能测试中也会遇到不少的重复工作。 比如某新兴业务处于上升阶段,需要在每个版本中,对某些新增接口进行性能测试,有时还需要在一天中的不同时段分别进行…

Lumion 和 Enscape 应该选择怎样的笔记本电脑?

Lumion 和 Enscape实时渲染对配置要求高,本地配置不够,如何快速解决: 本地普通电脑可一键申请高性能工作站,资产安全保障,供软件中心,各种软件插件一键获取,且即开即用,使用灵活&am…

23个react常见问题

1、setState 是异步还是同步? 合成事件中是异步 钩子函数中的是异步 原生事件中是同步 setTimeout中是同步 相关链接:你真的理解setState吗?: 2、聊聊 react16.4 的生命周期 图片 相关连接:React 生命周期 我对 Reac…

NFT Insider#105:The Sandbox即将参加韩国区块链周,YGG的声誉和进步(RAP)将引领玩家晋升到下一层级

引言:NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto(https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周…

sql_mode详解

文章目录 一、sql_mode作用二、查询sql_mode三、mysql8默认的mode配置(6个默认配置)四、常见mode详细解释mysql8默认配置了的mode(6个)需要自己配置的mode(4个) 五、设置sql_mode(一旦设置了&am…

蓝桥杯官网练习题(算式900)

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小明的作业本上有道思考题: 看下面的算式: (□□□□-□□□□)*□□900其中的小方块代表 0 ~ 9 的数字,这 10 个方块刚好包含了…

Vue:组件缓存

组件缓存 keep-alive 文章目录 组件缓存 keep-alive一、keep-alive是什么二、keep-alive优点三、问题四、解决方案五、代码示例 六、回顾一下钩子七、总结 一、keep-alive是什么 keep-alive是Vue中的一个内置组件,会缓存不活动的组件实例。并不会销毁组件&#xff…

django-项目

一、RESTful设计风格 基础概念 全称:Representational State Transfer 1.资源 网络上的一个实体,每个资源都有一个独一无二的URL与之对应;获取资源-直接访问URL即可 2.表现层 资源的表现形式 如HTML、xml、JPG、json等 3.状态转化 …

基于SSM的家政服务网站

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

QT Day2!!1.登录跳转界面 2.枚举类型 3.左值与右值4.面试问题

1.作业登录跳转界面 //form.h #ifndef FORM_H #define FORM_H#include <QWidget>namespace Ui { class Form; }class Form : public QWidget {Q_OBJECTpublic:explicit Form(QWidget *parent nullptr);~Form();public slots:void jump_slot();private:Ui::Form *ui; };…

ScheduledExecutorService 接口

ScheduledExecutorService 继承自 ExecutorService,用于支持按计划执行任务。它允许在将来的某个时间点或以固定时间间隔执行任务。ScheduledExecutorService 是使用 java.util.concurrent 包提供的功能之一。 以下是使用 ScheduledExecutorService 的一些基本示例: 定时执行…

【DB】Windows 环境修改MySql 8.0.x 密码

目录 一. 问题 二. 说明 三. 步骤 3.1 账户 3.2 服务 3.3 文件 四. 参考 一. 问题 好久没装数据了, 最近导入数据, 次哦&#xff0c;密码忘记了&#xff0c;网上搜了搜也不靠谱; 去管网上扒拉看看如何修改吧? 二. 说明 使用超级管理员模式, 看下本机 MySQL 版本号 $…

LeetCode(力扣)78. 子集Python

LeetCode78. 子集 题目链接代码 题目链接 https://leetcode.cn/problems/subsets/description/ 代码 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:result []self.backtracking(nums, result, 0, [])return resultdef backtracking(self, nu…

rust换源

在$HOME/.cargo/目录下建一个config文件。windows默认是C:\Users\user_name\.cargo。 config文件输入&#xff1a; [source.crates-io] registry "https://github.com/rust-lang/crates.io-index" # 使用 replace-with指明默认源更换为ustc源 replace-with ustc#…

如何实现自动化测试?

一、首先我们要清楚自动化测试的分类 以实现方式可分为UI自动化和接口自动化。UI自动化可用selenium等工具实现&#xff0c;接口自动化可用使用RobotFramework和Jmeter等工具实现&#xff0c;Jmeter也可做性能自动化&#xff0c;压力测试。 二、平时自动化测试怎么做 1. UI和…

WebGIS外包开发流程

WebGIS开发流程需要综合考虑前端和后端开发、地理信息数据处理、用户需求和安全性等多个方面。成功的WebGIS应用程序需要不断地进行更新和维护&#xff0c;以适应变化的需求和技术。WebGIS开发是一个复杂的过程&#xff0c;通常包括以下主要步骤。北京木奇移动技术有限公司&…

算法设计与分析 | 页码统计

题目&#xff1a; 一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排&#xff0c;每个页码都不含多余的前导数字0。例如第6页用6表示而不是06或006。数字统计问题要求对给定书的总页码&#xff0c;计算出书的全部页码中分别用到多少次数字0,1,2,3,...…

项目时间管理-架构真题(二十四)

1、霍尔提出了系统方法的三维结构体系&#xff0c;通常称为霍尔三维结构&#xff0c;这就是系统工程方法论的基础。霍尔三维结构以时间堆、&#xff08;&#xff09;堆、知识堆组成的立体结构概括性表示出系统工程在各阶段、各步骤以及所涉及的知识范围。其中时间维是系统的工作…