Android 一帧绘制流程分析笔记

news2024/9/22 10:35:03

92a388d5f7e3094359704f3e297d81da.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、显示一帧流程概览
二、生产者,消费者 BufferQueue 流转图
三、App ,SF Buffer 交互图
四、SF 跟 HWC 交互图

一、显示一帧流程概览

471001fc446528ec7313414ed6445f8e.png

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-5d802da2815c12f2.png

1.1 Android 显示一帧大致分为下面 八步:

  1. App 接收到 vsync-app 信号后开始工作。

  2. App 主线程被Message唤醒,执行onVsync。

  3. App 执行 doFrame ,处理input、animation、traversal、draw等。

  4. App UIThread 跟RenderThread sync 数据。

  5. App 执行DrawFrame,从SurfaceFlinger(后续简称SF) 的 BufferQueue 中 Dequeue buffer,取出一个bufffer后,执行渲染绘制,接着将绘制好的Buffer 通过queuebuffer 放回到。BufferQueue中给 SF消费。

  6. App queuebuffer 后, SF 中对应的 app buffer 会增加 +1。

  7. Vsync-sf 到来后,SF 从BufferQueue 中 acquireBuffer一个Buffer 进行消费, 对应SF 中的 app buffer 会减 - 1 , SF 消费处理后,通过 releaseBuffer 将buffer 归还到BufferQueue 中。

  8. SF 通过 bind 跟 Hardware Composer HAL(简称HWC) 进行通信,通过一些处理后显示到手机屏幕上。

二、生产者,消费者 BufferQueue 流转图

02199fa60ed539fa5d601ef6de73430e.png

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-1fd0a4018940ddd8.png

  1. dequeue(生产者发起) :
    当生产者需要缓冲区时,它会通过调用 dequeueBuffer() 从 BufferQueue 请求一个可用的缓冲区,并指定缓冲区的宽度、高度、像素格式和使用标记。

  2. queue(生产者发起):
    生产者填充缓冲区并通过调用 queueBuffer() 将缓冲区返回到队列。

  3. acquire(消费者发起) :
    消费者通过 acquireBuffer() 获取该缓冲区并使用该缓冲区的内容

  4. release(消费者发起) :
    当消费者操作完成后,它会通过调用 releaseBuffer() 将该缓冲区返回到队列

三、App ,SF Buffer 交互图

c79c9ab9a3cfc9b3fe37109dd9fb3d2a.png

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-9ee4c505abf5eff3.png

  1. App 通过bind 向SF dequeuebuffer 进行buffer申请

  2. SF 对端完成对bufferQueue 的dequeuebuffer的申请

  3. App 处理合成完后,通过binder向SF queuebuffer 申请buffer 入队。

  4. SF 对端通过queuebuffer 完成buffer 对BufferQueue的入队申请,供SF消费并显示到屏幕上

四、SF 跟 HWC 交互图

SurfaceFlinger 接受来自多个来源的数据缓冲区,对它们进行合成,然后发送到显示设备。

d51b88d1f1995cfdebc53a0c3228bb21.png

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-e2998c0cd7dd4219.png

95201f5aaa0c5d2e8fb4a7d947f8fd96.png

原图链接:
https://upload-images.jianshu.io/upload_images/5851256-53d12f9bfef6809a.png

  1. vsync-sf 周期到来,SF 开始绘制准备工作

  2. SF 通过 acquirebuffer 从BufferQueue 中取出一帧进行消费

  3. App 对应的BufferQueue 在SF acquirebuffer 后对那个的值会 -1

  4. App 对应的buffer 值为 2

  5. App 对应的buffer值 在SF acquirebuffer 后变为 1

  6. SF 跟HWC 通过binder 通信处理完后,通过rleasebuffer将buffer 归还到BufferQueue中,紧接着一帧就可以显示出来

友情推荐:

Android 开发干货集锦

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

032bdb1049fb30df95cfe810b5934739.jpeg

点击阅读原文,为大佬点赞!

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

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

相关文章

16.CSS中使用颜色

使用颜色 在计算机中,传统的模型之一为RGB模型,所有颜色都是通过红色、蓝色、绿色三种颜色进行组合;我们通过数值去表示 例如: 红色(255.0.0)、蓝色(0.0.255)、绿色(0.…

在IDEA中配置jeesite-(文章链接汇总)

建议按照文章顺序操作 原文里可以下载geesite项目 jeesite-github原文链接 jeesite-gitee原文链接–国内推荐 可 直 接 跳 到 此 步 骤 环境准备:JDK 1.8 or 11、17、Maven 3.6、使用 MySQL 5.7 or 8.0 数据库 1-Maven的下载安装配置教程(详细图文&am…

Vue3之循环渲染

1.何为循环渲染 在Vue3中,当我们需要渲染一个数组中的数据到dom元素上时,就需要使用循环渲染。循环渲染可以节约我们大量重复冗余的工作,比如我们去渲染一个下拉菜单的时候,如果不使用循环渲染,那么我们需要手动一项一…

2023美赛C代码思路结果【全部更新完毕】注释详尽

C题已完成全部代码,注释详尽,并增加扰动项,保证大家的结果不会撞 需要全部问题的可以点击:https://www.jdmm.cc/file/2708697/ 下面贴出核心代码: -- coding: utf-8 -- TODO: 入口函数 import numpy as np from…

Mr. Cappuccino的第43杯咖啡——Kubernetes之Pod控制器(二)

Kubernetes之Pod控制器Horizontal Pod Autoscaler(HPA)安装metrics-server创建Pod创建HPA压力测试JobCronJobHorizontal Pod Autoscaler(HPA) 上篇文章中所说的ReplicaSet和Deployment,我们已经可以通过手动执行kubec…

Shiro1.9学习笔记

文章目录一、Shiro概述1、Shiro简介1.1 介绍1.2 Shiro特点2、Shiro与SpringSecurity的对比3、Shiro基本功能4、Shiro原理4.1 Shiro 架构(外部)4.2 shiro架构(内部)二、Shiro基本使用1、环境准备2、登录认证2.1 登录认证概念2.2 登录认证基本流程2.3 登录认证实例2.4 身份认证源…

WordPress网站伪静态及固定链接设置教程

WordPress网站伪静态及固定链接设置教程-解决404错误问题!搭建好WordPress网站之后我个人建议首先要做的就是设置好固定链接,WordPress的固定链接也就是网站各个页面的链接格式,默认的方式不太符合现代化网站,推荐使用自定义的方案。既然涉及…

良许翻天覆地的2022年

大家好,我是良许,新年快乐呀~ 在我女室友坚持不懈的努力之下,2022年的最后一天我终于被她传染了,阳了~ 此时的我,正顶着37多度的低烧写下这篇年终总结。 2022年,对于大多数人而言,封控是主旋…

Git使用小乌龟克隆与推送代码Gitee--零命令行(组员版本)

目录 上一篇文章(必读!!!) 概述 分支概念(权限分配): 总体操作思想: 操作步骤 一、组员第一天上班(云端仓库代码克隆到本地仓库进行代码编写&#xff…

网日志处理中的应用架构-《大数据时代的IT架构设计》

用户的上网行为中蕴含着大量的客户特征和客户需求信息,这些信息至关重要,这就要求用户的上网日志记录必须被保存,而且还需要进行数据分析挖掘处理,然后根据处理结果定义用户的行为习惯,为电信运营商实现精细化运营提供重要的营销依…

【数据库】Clickhouse 实践之路

文章目录背景Clickhouse简介为什么选择ClickhouseClickhouse特性Clickhouse建设整体架构数据接入层数据存储层数据服务层数据应用层Clickhouse运维管理平台配置文件结构元数据管理自动化运维用户管理集群操作监控与报警Clickhouse应用BI查询引擎核心诉求选型对比集群构建问题及…

基于jeecgboot的flowable流程设计器的几个bug修复

因为今天在用任务监听器的时候,出现几个bug,所以一并修复与处理。 一、建立任务监听器后,删除不了 主要有两个原因,一个是点击删除没反应,实际上是弹出框跑到后面去了,说明还是z-index问题,调整…

.Net Core中使用NEST简单操作Elasticsearch

C#中访问Elasticsearch主要通过两个包NEST和Elasticsearch.Net,NEST用高级语法糖封装了Elasticsearch.Net可以通过类Linq的方式进行操作,而Elasticsearch.Net相比之下更为原始直接非常自由。注意:ES的8.X以上的版本有新的包Elastic.Clients.E…

二极管的“几种”应用

不知大家平时有没有留意,二极管的应用范围是非常广的,下面我们来看看我想到几种应用,也可以加深对电路设计的认识: A,特性应用: 由于二极管的种类非常之多,这里这个大类简单罗列下&#xff1a…

SpringCloud Alibaba集成Dubbo实现远程服务间调用

SpringCloud Alibaba集成Dubbo实现远程服务间调用 工程创建 一、创建springBoot分模块项目,父工程:springcloud-alibaba以及子模块product-dubbo-provider、order-dubbo-consumer等 项目基本结构图如下所示: 二、依赖引入 在以上两个子模块…

数值方法笔记1:数字表示与误差分析

1 有意义数位概念与有意义数位损失1.1 怎么分析误差2 逼近阶 与渐近记法3 误差传播与稳定性1 有意义数位概念与有意义数位损失 整数的二进制表示使用短除法,网上有很多文章,这里就不再过多赘述了。 提一嘴小数的二进制表示。下面列举了一个例子。 在表…

【Spark分布式内存计算框架——Spark SQL】12. External DataSource(下)rdbms 数据

6.7 rdbms 数据 回顾在SparkCore中读取MySQL表的数据通过JdbcRDD来读取的,在SparkSQL模块中提供对应接口,提供三种方式读取数据: 方式一:单分区模式 方式二:多分区模式,可以设置列的名称,作为…

实例三:MATLAB APP design-多项式函数拟合

一、APP 界面设计展示 注:在左侧点击数据导入,选择自己的数据表,如果数据导入成功,在右侧的空白框就会显示数据导入成功。在多项式项数右侧框中输入项数,例如2、3、4等,点击计算按钮,右侧坐标框就会显示函数图像,在平均相对误差下面的空白框显示平均相对误差。

buu [NPUCTF2020]Classical Cipher 1

题目描述: 题目分析: 首先输入密码 {gsv_pvb_rh_zgyzhs} 后,得到:可以得知密码是错误的,再看看密码 {gsv_pvb_rh_zgyzhs} ,排列无序,那么尝试用凯撒与栅栏解密,发现还是解不出&…

Python基础3

目录 1. 函数多返回值 2. 函数多种传参方式 3. 匿名函数 3.1 函数作为参数传递 3.2 lambda匿名函数 4. 文件的读取操作 4.1 open()打开函数 4.2 读操作方法 4.3 文件的写入 4.4 文件的追加 5. 异常的捕获方法 5.1 捕获常规异常 5.2 捕获指定…