Framework UI机制之Choreographer编舞者

news2024/11/26 13:38:58

Choreographer(编舞者)

Choreographer(编舞者)是 Android 系统中的一个重要组件,用于协调和管理界面的动画和渲染操作的时机。它负责在界面上正确地处理和同步动画、布局和绘制操作,以保证流畅的用户体验。

Choreographer主要作用

  1. 动画调度:Choreographer 调度和管理应用程序中的动画效果。它确保动画按照预定的帧率和时间表进行播放,并平滑地过渡到下一个动画阶段。
  2. 布局请求:当视图需要进行布局操作时,Choreographer 发出布局请求并协调布局操作的执行。它确保将布局请求与其他动画和绘制操作同步,避免冲突和界面不一致。
  3. 绘制同步:Choreographer 负责将绘制操作与显示器的刷新同步。它通过监听系统的 VSYNC(垂直同步)信号,确定绘制操作的时机,以避免图形撕裂和卡顿现象。
  4. 输入事件处理:Choreographer 管理和分发用户输入事件,确保它们在正确的时间点被处理,并与动画和渲染操作同步。这有助于提供更流畅和响应敏捷的用户交互体验。

VSYNC信号的本质意义

它的工作原理基于 VSYNC(垂直同步)信号,而 VSYNC 信号的本质意义在于保证界面的流畅性和稳定性。

VSYNC 是一个硬件信号,它与显示器的刷新频率相对应,通常为每秒60次(60Hz)。每当屏幕进行一次垂直刷新时,VSYNC 信号被发出,作为显示器和图形引擎之间的时间同步标准。

编舞者(Choreographer)的任务是根据 VSYNC 信号的触发来调度和同步界面的动画和渲染操作。它使用了以下几种机制来实现流畅的界面渲染:

  • 垂直同步(VSYNC):Choreographer 监听系统发送的 VSYNC 信号。每当收到 VSYNC 信号时,Choreographer 知道屏幕即将进行一次刷新。这样,它可以根据 VSYNC 信号的时间点来安排动画和渲染操作的触发和执行。
  • 时间戳(Timestamping):Choreographer 在收到 VSYNC 信号时,会获取一个时间戳,以记录每次 VSYNC 信号的时间点。这个时间戳可以用于计算动画和渲染操作的时机和持续时间,从而在合适的时机进行调度和执行。
  • 界面刷新(Frame Refresh):Choreographer 使用 VSYNC 信号和时间戳来决定界面的刷新时机。它根据预定的逻辑和优先级,调度动画、布局和绘制操作,以确保它们在下一次 VSYNC 信号到来之前完成。这样可以避免界面的撕裂或卡顿现象,提供流畅的用户体验。

Surfaceflinger对信号的返回本质

SurfaceFlinger 是 Android 系统中负责图形渲染的服务组件,它在图形层级中起着关键作用。SurfaceFlinger 的返回信号本质上是用于同步图形渲染和显示的。

当 Choreographer 调度完成动画和渲染操作后,它会将渲染结果提交给 SurfaceFlinger,然后等待 SurfaceFlinger 的返回信号。这个返回信号通常称为图形层导航栏(HWC-VSYNC)信号。

SurfaceFlinger 接收到图形层导航栏信号时,会开始将渲染结果合成并显示在屏幕上。合成过程包括将各个应用程序的窗口内容合并为一个帧缓冲区,然后将帧缓冲区的内容传输到显示器的视频输出。

返回信号的主要目的是在图形渲染和显示之间进行同步,以避免图像撕裂、卡顿或不同步的情况发生。通过等待图形层导航栏信号的返回,Choreographer 可以确保渲染操作在正确的时间点提交给 SurfaceFlinger,从而与屏幕刷新同步。

在整个流程中,Choreographer 和 SurfaceFlinger 的协同工作保证了视图的动画、布局和绘制操作的准确显示。通过正确处理图形层导航栏信号的返回,Android 系统能够提供流畅的界面渲染和动画效果,提升用户体验

Choreographer如何做到帧率控制与绘制同步?

它通过以下方式实现这两个目标:

  1. 垂直同步(VSYNC)信号:Choreographer 通过监听系统的 VSYNC 信号来进行帧率控制和绘制同步。VSYNC 信号是一个硬件信号,表示显示器每次垂直刷新的时机。Choreographer 通过与 VSYNC 信号的同步来确定每一帧绘制的时机。
  2. 时间戳(Timestamp):当 Choreographer 收到 VSYNC 信号时,它会获取一个时间戳(Timestamp)。时间戳记录了 VSYNC 信号的发生时间点,以及绘制操作的时机。利用时间戳,Choreographer 可以计算出两次 VSYNC 信号之间的时间间隔,从而控制绘制的频率。
  3. Choreographer 的调度机制:Choreographer 使用时间戳和预定的帧率逻辑,调度和控制各个动画和绘制操作的触发和执行时机。它确保这些操作在下次 VSYNC 信号到来之前完成,以避免帧的丢失或绘制的延迟。
  4. 双缓冲(Double Buffering)机制:Choreographer 使用双缓冲机制来提高绘制效率和避免界面撕裂。双缓冲意味着绘制操作先在一个离屏缓冲区(Off-screen Buffer)中进行,然后在合适的时机将绘制结果复制到屏幕上。这样可以保持界面的稳定性和一致性。

帧率控制与绘制同步示例

当编写 Android 应用程序时,可以利用 Choreographer 来实现帧率控制和绘制同步。下面是一个简单的实战示例,展示如何使用 Choreographer 来控制动画的帧率和绘制同步:

public class MyAnimationView extends View {
    private static final long FRAME_INTERVAL = 16; // 目标帧率为每秒60帧,所以每帧时间为16毫秒
​
    private Choreographer mChoreographer;
    private long mLastFrameTime;
​
    public MyAnimationView(Context context) {
        super(context);
        mChoreographer = Choreographer.getInstance();
    }
​
    @Override
    protected void onDraw(Canvas canvas) {
        // 绘制你的动画内容
​
        // 请求下一帧绘制
        mChoreographer.postFrameCallback(frameCallback);
    }
​
    private Choreographer.FrameCallback frameCallback = new Choreographer.FrameCallback() {
        @Override
        public void doFrame(long frameTimeNanos) {
            // 计算距离上次帧的时间间隔
            long currentTime = TimeUnit.NANOSECONDS.toMillis(frameTimeNanos);
            long elapsedTime = currentTime - mLastFrameTime;
            mLastFrameTime = currentTime;
​
            // 控制帧率
            if (elapsedTime >= FRAME_INTERVAL) {
                // 进行绘制操作
                invalidate();
            } else {
                // 继续等待下一帧
                mChoreographer.postFrameCallback(this);
            }
        }
    };
}

在上述示例中,MyAnimationView 是一个自定义的 View,用于绘制动画。在 onDraw() 方法中,我们绘制了动画的内容。然后,我们通过 Choreographer.postFrameCallback() 请求下一帧的绘制。

在 frameCallback 中,我们使用 Choreographer 的 FrameCallback 接口来处理每一帧的回调。首先,我们计算距离上一帧的时间间隔 elapsedTime。然后,我们根据目标帧率和实际时间间隔决定是否进行绘制操作。

如果经过了足够的时间(大于等于每帧时间16毫秒),我们进行绘制操作,并调用 invalidate() 方法通知 View 进行重绘。否则,我们继续等待下一帧,通过 mChoreographer.postFrameCallback(this) 请求再次调用 frameCallback,直到满足绘制的时间间隔。

通过这种方式,我们可以控制动画的帧率,并与 VSYNC 信号同步绘制,从而实现流畅的动画效果和绘制同步。

本文主要讲解在framework UI绘制中的 Choreographer编舞者 ,主要讲了 Choreographer实现帧率控制与绘制同步 。有关更多的UI机制学习或者framework进阶,可以 参考《framework全家桶》点击可以查看详细类目。

文末

UI(用户界面)机制是指框架(Framework)中用于构建用户界面的一系列规则、组件、工具和模式。这些机制提供了一种结构化和可扩展的方法,使开发人员能够设计、构建和管理用户界面的各个方面。

在一个框架中,UI机制通常包括以下几个方面:

  1. 组件层次结构:UI机制定义了组件(Component)之间的层次结构关系。它规定了如何将小组件组合成更复杂的组件,以构建整个用户界面。组件层次结构确定了每个组件的父子关系、布局和交互方式。
  2. 布局和定位:UI机制提供了布局和定位的方式,用于确定组件在用户界面中的位置和大小。布局机制可以使用不同的算法和容器,例如线性布局、网格布局或绝对定位。通过使用布局和定位,开发人员可以灵活地设计界面的外观和布局。
  3. 视图管理:UI机制提供了视图管理的方法,用于管理显示在用户界面上的视图。它可以包括视图的创建、销毁、显示、隐藏和更新等操作。视图管理机制确保用户界面的状态与应用程序数据的状态保持同步。
  4. 事件处理:UI机制允许开发人员定义和处理用户界面上的事件,例如点击、滚动、拖拽等用户交互行为。通过事件处理机制,开发人员可以响应用户的操作,并执行相应的业务逻辑或界面更新操作。
  5. 样式和主题:UI机制支持样式和主题的定义和应用。通过样式和主题机制,开发人员可以定义和管理界面元素的外观、颜色、字体、动画和其他视觉属性。这使开发人员能够以统一的方式定义和应用界面的外观样式,提供一致的用户体验。

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

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

相关文章

Java基础---常见的语法糖

目录 典型回答 如何解语法糖 糖块一、switch 支持 String 与枚举 糖块二、泛型 糖块三、自动装箱与拆箱 糖块四、方法变长参数 糖块五、枚举 糖块六、内部类 糖块七、条件编译 糖块八、断言 糖块九、数值字面量 糖块十、for-each 糖块十一、try-with-resource 糖…

TigerBot和ChatGLM-6B大语言模型

目录 1 TigerBot大语言模型 1.1 环境安装 1.2 模型下载 1.2.1 hugging face 网站下载 1.2.2 百度网盘下载 1.3 推理 2 ChatGLM大语言模型 2.1环境搭建 2.2 模型下载 2.3 推理 1 TigerBot大语言模型 虎博科技”发布自研多模态大模型TigerBot,开源模型、代码…

Focal Loss损失函数

目录 前言 交叉熵损失函数 平衡交叉熵 Focal Loss 代码实现 前言 Focal loss是一个常用的解决类别不平衡问题的损失函数,由何恺明提出的(论文名称:Focal Loss for Dense Object Detection),用于图像领域解决one-…

学习系统编程No.29【线程执行过程之页表详解】

引言: 北京时间:2023/7/3/14:09,刚睡醒,放假在家起床时间确实不怎么好调整,根本固定不了一点,当然通俗点说也就是根本起不来,哈哈哈,已经很少见到那种7点起来码字的情形了&#xff…

NanopcT4 系统 人脸检测实验 超详细教程 代码及操作步骤

文章目录 1.NanopcT4 系统烧写详细操作步骤2.vim 使用与 gcc 使用3.makefile 使用4.GPIO 引脚查看与连接5.使用vim 编写 LED 灯闪烁c 语言程序test1.c6.使用vim 编写 LED 灯闪烁shell 脚本程序test2.sh7.在ARM 上实现人脸检测 1.NanopcT4 系统烧写详细操作步骤 1)准备一张 8G …

口语理解任务源码详解系列(二)利用seq2seq-attention模型实现

利用seq2seq-attention模型实现 写在前面 在前文介绍了项目的数据集构建:传送门 本文利用seq2seq-attention实现:实现细节请参考论文:《Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling》 1.意…

喜羊羊贴吧顶帖软件实战教学

喜羊羊贴吧顶帖软件实战教学#贴吧顶帖#贴吧推广 大家好,欢迎来到百收网SEO这期视频,给大家更新一下百度贴最新的一个顶帖视频教程。首先我们今天用的顶帖软件是我们的喜羊羊173 的一个版本,软件的话在我们的群文件去下载,就是我们…

如何查看货物的物流状态

想不想有一个一键批量查询快递号的软件?今天,小编向您介绍一款软件:“固乔快递查询助手”,该软件是固乔工作室正式推出的专业快递和物流单号出货信息批量查询软件。这款软件功能实用,操作简单,页面简单&…

使用 Jackson 库对日期时间的动态序列化反序列化操作

0.背景 因某项目中的数据报表功能在创建年报 和月报时需要生成不同的日期格式,但数据结构未变,为避免类的冗余定义,故使用如下方式来动态设置日期格式,在不同报表是使用不同格式的时间格式来保存数据。 1.代码介绍 PS:此介绍有Cha…

深度学习技巧应用23-利用latex对深度学习各种网络模型的图像进行绘制

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用23-利用latex对深度学习各种网络模型的图像进行绘制,大家知道那些好看的模型结构图是怎么画的吗?今天就给大家手把手的利用latex绘画出深度学习模型图出来,我将利用latex画出AlexNet,LeNet,VGG16,U-Net高清的网络模型…

微服务一 实用篇 - 5.1 ElasticSearch安装

《微服务一 实用篇 - 5.1 ElasticSearch安装》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《微服务一 实用篇 - 5.1 ElasticSearch安装》 《微服务一 实用篇 - 5.1 ElasticSearch安装》1.部署单点es1.1.创建网络1.2.加载镜像1.3.运行 2.部署kibana2.1…

达芬奇快编键盘使用指南——个人白皮书分享

文章目录 序言常见问题(陆续更新)1.没有指示灯,不知道怎么开机 功能分区和翻译查询A快编工具(Smart Insrt)B修剪工具(Trim In)C多功能按键(Esc)D多机位区(Cam…

新加坡访问学者签证申请的三个注意事项

新加坡是一个独特而美丽的国家,吸引了许多学者和研究人员前来访问和交流。如果您计划前往新加坡进行学术交流,下面是知识人网小编整理的关于新加坡访问学者签证申请的三个注意事项,希望对您有所帮助。 1. 签证申请和文件准备: 在…

Scala入门到放弃—01—概述

文章目录 概述什么是是Scala?为什么要使用Scala? 配置环境安装测试附 基本语法定义变量基本数据类型lazy在Scala中的应用 概述 什么是是Scala? https://www.scala-lang.org/ Scala combines object-oriented and functional programming in one conci…

ELK实验部署过程

ELK集群部署环境准备 配置ELK日志分析系统 192.168.1.51 elk-node1 es、logstash、kibana 192.168.1.52 elk-node2 es、logstash 192.168.1.53 apache logstash (我这里是把虚拟机的配置全部都改为2核3G的) 2台linux 第1台:elk-nod…

大数据开发工程师前景如何?

大数据需求越来越多,只有技术在手不愁找不到工作。 大数据工程师的技术要求如下: 1、掌握至少一种数据库开发技术:Oracle、Teradata、DB2、Mysql等,灵活运用SQL实现海量数据ETL加工处理; 2、熟悉Linux系统常规shell…

软件工程——第8章维护知识点整理

本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 文章目录 1.维护阶段的基本任务是? 2.大型软件的维护成本大概是开发成本的几倍? 3.什么是软件维护? 4.软件维护分为哪几类…

python代码练习:猜成语游戏

python代码练习:猜成语游戏 题目结果展示源代码 题目 成语填填乐,随机输出一条包含一个空格的成语,填写答案并判断是否正确,正确加2分,输出“正确,你真棒”,错误减2分,输出“错了”…

git tag详解

文章目录 前言1. Git tag的基本概念和用法1.1. 什么是 Git tag?1.2. Git 标签有什么作用? 2. 创建 Git tag2.1. 创建轻量级tag2.2. 创建带有注释的tag2.3. 编辑已有的tag 3. 列出和检出 Git tag3.1. 列出所有tag3.3. 列出匹配的tag3.4. 检出tag 4. 将 Gi…

可视化 | Flask+Mysql+PyEcharts 电影Top250数据分析系统

文章目录 🏳️‍🌈 1. 数据库数据表1. 电影信息数据表2. 用户数据表 🏳️‍🌈 2. 各子界面1. 登陆界面2. 注册界面3. 电影信息概要界面4. 搜索界面5. 各年份上映电影数量6. 电影榜单TOP107. 评价人数TOP208. 地区电影TOP109. 电影…