Android图像系统与Choreographer

Android图像系统与Choreographer

  • 一.图像显示系统概述
    • 1.双缓存机制和VSync机制
    • 2.三缓存机制
  • 二.Choreographer
    • 1.Choreographer的初始化
    • 2.Choreographer的使用
      • 2.1 添加任务
      • 2.1 任务执行

一.图像显示系统概述

    一个基础的图像显示系统由CPU、GPU、屏幕三部分组成。CPU负责计算帧数据,GPU负责渲染图形数据,屏幕负责图像的显示。在屏幕显示图像时,会按照从上向下逐行扫描的方式扫描每一帧图像的像素。

    由于CPU与GPU处理数据的时间不可控,因此会导致屏幕刷新率与渲染帧率不一致。具体表现为在扫描第一帧图像扫描的过程中出现第二帧图像,引起屏幕中画面的撕裂。

1.双缓存机制和VSync机制

    为了解决画面的撕裂,在图像显示系统中引入了双缓存机制和VSync机制。

    双缓存机制是指使用frameBuffer和backBuffer两块内存作为帧缓存,屏幕每次从frameBuffer中获取当前帧图像进行扫描,在屏幕扫描的同时,CPU与GPU使用backBuffer渲染下一帧图像。

    VSync机制是指当屏幕扫描完最后一行像素时,需要返回到第一行像素的位置,这时屏幕设备会产生一个垂直同步信号,即VSync。在收到VSync信号后,frameBuffer与backBuffer中的图像数据进行交换。交换完成后,屏幕会继续从frameBuffer中扫描下一帧图像。屏幕每秒钟产生的VSync信号的次数就是帧率。

    当一个VSync信号发出后,如果在下一次VSync信号到来前,GPU还没有完成下一帧数据的渲染,此时frameBuffer中的数据无法与backBuffer中的数据进行交换,会出现屏幕持续扫描同一帧图像的现象,即掉帧。

2.三缓存机制

    通常情况下,掉帧是由于绘制的图像过于复杂,需要消耗大量的时间。为了解决这个问题,Android系统会在每次收到VSync信号后,尽可能去安排CPU计算帧数据,以此来减少掉帧问题的发生。

    同时,Android引入了三缓存机制。三缓存机制就是在frameBuffer和backBuffer之外,又加入了graphicBuffer。
当出现一次掉帧后,会启用三缓存机制,以此减少后续掉帧问题的发生。
在这里插入图片描述
    当然,帧缓存也不是越多越好,帧缓存过多会造成内存压力,降低画面的实时性。

二.Choreographer

    Choreographer是Android中用于监听VSync信号,并在VSync信号到来时执行指定任务的组件。Choreographer是线程单实例,它的创建依赖当前线程的Looper,可以通过Choreographer的静态方法getInstance获取。

1.Choreographer的初始化

    在Choreographer的构造方法中,会创建三个重要的对象mHandler、mDisplayEventReceiver、mCallbackQueues,它们对应的类型分别为FrameHandler、FrameDisplayEventReceiver、Array。

  • FrameHandler:用于将操作切换到Choreographer对应的线程。
  • FrameDisplayEventReceiver:用于请求和接收VSync信号。
  • Array<CallbackQueue>:用于添加待执行的任务,由于callbackQueue的类型有五种类型,因此数组长度为5。
    //输入事件,首先执行public static final int CALLBACK_INPUT = 0;//动画,第二执行public static final int CALLBACK_ANIMATION = 1;//插入更新的动画,第三执行public static final int CALLBACK_INSETS_ANIMATION = 2;//绘制,第四执行public static final int CALLBACK_TRAVERSAL = 3;//提交,最后执行,public static final int CALLBACK_COMMIT = 4;

2.Choreographer的使用

2.1 添加任务

    当需要在VSync信号到来时执行某些操作,可以通过调用Choreographer的postCallback方法实现,该方法接收一个Runnable对象作为参数。

    在Choreographer的postCallback方法中会调用postCallbackDelayed方法,最终会调用postCallbackDelayedInternal方法。
在这里插入图片描述
    在Choreographer的postCallbackDelayedInternal方法内部主要做了四件事:

1)计算添加当前任务的时间戳。

2)根据任务类型,获取任务队列。

3)将任务添加到任务队列中。

4)请求VSync信号。

在这里插入图片描述
    在CallbackQueue的addCallbackLocked方法中,主要做了三件事:

1)将当前任务封装成CallbackRecord。

2)从头遍历任务链表,按照添加任务的时间戳从小到大的顺序,找到当前任务对应的位置。

3)将当前任务插入到对应位置。

在这里插入图片描述
    在Choreographer的scheduleFrameLocked方法中,主要做了三件事:

1)检查当前方法是否运行在Choreographer对应的线程。

2)如果运行在Choreographer对应的线程,则请求VSync信号。

3)如果没有运行在Choreographer对应的线程,则通过FrameHandler切换到对应线程请求VSync信号。
在这里插入图片描述

2.1 任务执行

    当VSync信号到来时,会回调FrameDisplayEventReceiver的onVsync方法。onVsync方法内部会调用FrameHandler方法发送异步消息,将线程切换到Choreographer对应的线程。
在这里插入图片描述
    最终会调用FrameDisplayEventReceiver的run方法。由于FrameDisplayEventReceiver是Choreographer的内部类,run方法内部会直接调用Choreographer的doFrame方法。在doFrame方法中,首先会根据时间戳计算并处理掉帧,然后按照CALLBACK_INPUT、CALLBACK_ANIMATION、CALLBACK_INSETS_ANIMATION、CALLBACK_TRAVERSAL、CALLBACK_COMMIT顺序,调用doCallbacks方法。
在这里插入图片描述
    在Choreographer的doCallbacks方法中,主要做了三件事:

1)根据任务类型,获取任务队列。

2)从任务队列中获取第一个任务并执行。

3)获取下一个任务,继续执行,直到任务队列中所有任务都执行完毕。

在这里插入图片描述
    在CallbackRecord的run方法中,会根据添加任务时传递的token区分任务类型。

    如果是通过postVsyncCallback方法添加的任务,则任务类型为VsyncCallback,会调用VsyncCallback的onVsync方法。

    如果是通过postFrameCallback方法添加的任务,则任务类型为FrameCallback,会调用FrameCallback的doFrame方法。

    如果是通过postCallback方法添加的任务,则任务类型为Runnable,会调用Runnable的run方法。

在这里插入图片描述

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

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

相关文章

基于transformers框架实践Bert系列4-文本相似度

本系列用于Bert模型实践实际场景&#xff0c;分别包括分类器、命名实体识别、选择题、文本摘要等等。&#xff08;关于Bert的结构和详细这里就不做讲解&#xff0c;但了解Bert的基本结构是做实践的基础&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

两数交换,数组查找奇数个数的数(位运算)

文章目录 一、异或运算&#xff1a;1.1 Demo1.2 面试题 一、异或运算&#xff1a; 1.1 Demo 0和N进行异或运算都等于N 任何一个数和自己异或运算都等于0 且异或运算满足交换率 a^b b^a eg&#xff1a; a 甲 &#xff0c; b 已 那么则有 a a^b ​ b a^b ​ a a^b 故有&am…

ACM实训第十七天

Is It A Tree? 问题 考试时应该做不出来&#xff0c;果断放弃 树是一种众所周知的数据结构&#xff0c;它要么是空的(null, void, nothing)&#xff0c;要么是一个或的集合满足以下属性的节点之间有向边连接的节点较多。 •只有一个节点&#xff0c;称为根节点&#xff0c;它…

Skywalking快速介绍

&#xff08;01&#xff09;SkyWalking简介 SkyWalking专为微服务&#xff0c;云原生架构和基于容器&#xff08;Docker&#xff0c;k8s&#xff0c;Mesos等&#xff09;的架构设计的应用程序性能监控工具&#xff0c;用于收集、分析、聚合和可视化来自服务和云原生基础设施的数…

Varjo XR-4功能详解:由凝视驱动的XR自动对焦相机系统

Varjo是XR市场中拥有领先技术的虚拟现实设备供应商&#xff0c;其将可变焦距摄像机直通系统带入到虚拟和混合现实场景中。在本篇文章中&#xff0c;Varjo的技术工程师维尔蒂莫宁详细介绍了这项在Varjo XR-4焦点版中投入应用的技术。 对可变焦距光学系统的需求 目前所有其他XR头…

Android 构建时:Manifest merger failed : Attribute application@name value

在AndroidStudio 构建时发现此问题&#xff1a; Manifest merger failed : Attribute applicationname value解决方案&#xff1a;在主Manifest中增加replace <applicationandroid:name".MyApp"android:allowBackup"false"tools:replace"android…

Linux:Ubuntu修改root密码

Linux&#xff1a;Ubuntu修改root密码 修改默认grub配置文件 rootshanxin:~# vim /etc/default/grub# 主要修改内容如下&#xff1a;GRUB_DEFAULT0 #GRUB_TIMEOUT_STYLEhidden 注释这一行 GRUB_TIMEOUT5 # 将这一行的时间改为5秒进行开启启动的grub文件的复写 rootshanxin:~…

不懂平面设计,这篇文章教你制作商业画册

​商业画册不仅是企业展示形象、推广产品的重要工具&#xff0c;也是设计师展现创意的平台。因此&#xff0c;制作一本高质量的画册对于企业来说至关重要。 那要怎么着手制作呢&#xff1f;以下是关于制作商业画册的步骤。 1.要制作电子杂志,首先需要选择一款适合自己的软件。…

Linux - 整理工作中常用的 Linux 命令(目录、文件、系统、进程、网络)持续更新~

目录 一、Linux 目录结构 二、Linux 中的常用指令 2.1、目录命令 cd 切换目录 pwd 打印当前所在目录 ls 展示当前目录内容 mkdir 创建目录 du 统计每个目录下的文件字节数 2.2、文件命令 which 查找 命令字 所在位置 find 查找文件 touch 创建一个空文件 cp 复制文…

设计软件有哪些?数据交换和导入导出工具篇,渲染100邀请码1a12

设计师制作的项目通常要在各种软件里导入导出&#xff0c;互相交换格式&#xff0c;这次我们介绍一些数据交换和导入导出工具。 1、OBJ OBJ&#xff08;Object File Format&#xff09;是一种常用的3D模型文件格式&#xff0c;用于存储和交换三维模型数据。它由一系列文本行组…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-18讲 高精度延时定时器GPT

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

前端 CSS 经典:元素倒影

前言&#xff1a;好看的元素倒影&#xff0c;可以通过-webkit-box-reflect 实现。但有兼容问题&#xff0c;必须是 webkit 内核的浏览器&#xff0c;不然没效果。但是好看啊。 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"&g…

VUE3好看的酒网站模板源码

文章目录 1.设计来源1.1 首页界面1.2 十大名酒界面1.3 名酒新闻界面1.4 联系我们界面1.5 在线留言界面 2.效果和结构2.1 动态效果2.2 代码结构 3.VUE框架系列源码4.源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/detai…

【C++初阶】—— 类和对象 (下)

&#x1f4dd;个人主页&#x1f339;&#xff1a;EterNity_TiMe_ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 类和对象 1. 运算符重载运算符重载赋值运算符重载前置和后置重载 2. 成员函数的补充3. 初始化列…

Java中String类常用方法

写笔记记录自己的学习记录以及巩固细节 目录 1.String类的常用方法 1.1 字符串构造 1.2 String对象的比较 1.2.1 比较两个字符串是否相等 1.2.2 比较两个字符串的大小 1.3 字符串查找 1.4 字符串的转化 1.4.1 字符串转整数 1.4.2 字符串转数字 1.4.3 大小写的转换 1…

IT革命浪潮:技术革新如何改变我们的生活与工作

一、技术革新与行业应用 当前的IT行业正处于前所未有的技术革新阶段。其中&#xff0c;量子计算和虚拟现实是两项引人注目的技术。 量子计算&#xff1a;量子计算以其超越传统计算的潜力&#xff0c;正在逐步从理论走向实践。在材料科学、药物研发和气候模型等复杂计算领域&a…

利用kubeadm安装k8s集群 以及跟harbor私有仓库下载镜像

目录 环境准备 master&#xff08;2C/4G&#xff09; 192.168.88.3 docker、kubeadm、kubelet、kubectl、flannel node01&#xff08;2C/2G&#xff09; 192.168.88.4 docker、kubeadm、kubelet、kubectl、flannel node02&#xff08;…

Ansible自动化运维中的file文件模块模块应用详解

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月21日15点21分 &#x1f4af;趣站推荐&#x1f4af; 前些天发现了一个巨牛的&#x1f916;人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xf…

向npm发布自己写的vue组件,使用vite创建项目

向npm发布自己写的vue组件&#xff0c;使用vite创建项目 创建项目 pnpm create vite输入项目名称 由于我的组件是基于 ant-design-vue和vue的&#xff0c;需要解析.vue文件&#xff0c;我又安装了下面4个。 然后执行 pnpm i安装依赖 vite.config.ts import { defineC…

linux系统——ps命令的两种参数模式

ps命令后面接参数时&#xff0c;有“—”符号与无此符号&#xff0c;在具体实现功能上有很大区别 能够清晰表达进程之间层级关系