Android图形-架构1

news2024/10/6 5:59:44

目录

引言

Android图形的关键组件:

Android图形的pipeline数据流

BufferQueue是啥?


引言

Android提供用于2D和3D图形渲染的API,可与制造商的驱动程序实现代码交互,下面梳理一下Android图形的运作原理。
应用开发者通过三种方式将图像绘制到屏幕上:Canvas,OpenGLES Vulkan

Android图形的关键组件:

1)图像流生产:图像流生产方可以生成图形缓冲区以供消耗。相机预览,播放器播放视频,OpenGL ES画图

2)图像流消耗:图像流的消耗方是Surfaceflinger,该系统服务会消耗当前可见的 Surface,并使用窗口管理器中提供的信息将它们合成到屏幕。

另外我们需要知道:    

        SurfaceFlinger 是可以修改所显示部分内容的唯一服务。
        SurfaceFlinger 使用 OpenGL 和 Hardware Composer 来合成一组 Surface。

3)HWC:显示子系统的硬件抽象实现。

        HWC可以将某些合成工作委托给硬件混合渲染器,以分担 OpenGL 和 GPU 上的工作量。
        SurfaceFlinger 只是充当另一个 OpenGL ES 客户端。因此,在 SurfaceFlinger 将一个或两个缓冲区合成到第三个缓冲区中的过程中,它会使用 OpenGL ES。这会让合成的功耗比通过 GPU 执行所有计算时更低。硬件混合渲染器 HAL 则进行另一半的工作,是所有 Android 图形渲染的中心点。
        Hardware Composer 必须支持事件,其中之一是 VSYNC(另一个是支持即插即用 HDMI 的热插拔)。

4)Gralloc:图形缓存分配器,分配图像生产方请求的内存。

       图1.Surface如何被渲染

从图1,可以看到几个关键组件的基本关系情况:

1)图像流生产方会持有native框架的Surface

2)图像流生产方的窗口信息会由WindowManager管理

3)图像流消费方从WindowManager获取渲染信息进行渲染通过HAL提供给HWC进行合成

Android图形的pipeline数据流

下面看看Android图形的pipeline数据流:

图2.Android图形的数据流

左侧是生成图形缓冲区的渲染器,右侧是合成器,HWC是混合渲染器。

结合图形的组件架构有4个理解:

第一,图形生产方生产的缓冲区包括:
1)状态栏:STATUS BAR
2)系统栏:SYSTEM BAR
3)背景渲染器:BACKGROUND RENDERER
4)图标/控件渲染器:ICONS/WIDGETS RENDERER

第二,从图2看出是通过GPU进行渲染,并且通过BufferQueue进行生产方和消费方的流转管理。

第三,有些图层是可以直接提交给HWC进行合成的,有些是通过SurfaceFlinger进行合成,然后再提交到HWC进行最终合成的;其中Surfaceflinger合成使用的是OpenGLES来进行渲染合成的。

第四,生产方,消费方组件之间都是通过BufferQueue粘合起来的

BufferQueue是啥?

1)BufferQueue是Android图形组件之间的粘合剂

2)他们是一对队列,可以循环调解缓冲区从生产方到消耗方

BufferQueue 可以在三种不同的模式下运行:

Synchronous-like mode:同步模式,如果生产速度快于消费速度,那么生产就会停下来等待消费完再进行生产(等待可用的缓冲区)。这种方式不会丢弃任何缓冲区。
Non-blocking mode:非阻塞模式,可以理解为异步模式。这个方式下会生成错误,而不是等待缓冲区,有助于避免出现死锁现象。这种方式页不会丢弃任何缓冲区。
Discard mode:舍弃模式。BufferQueue 可以配置为丢弃旧缓冲区,而不是生成错误或进行等待。例如,如果对纹理视图执行 GL 渲染并尽快绘制,则必须丢弃缓冲区。

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

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

相关文章

pm2 运行springboot项目

创建springboot项目打包 注意安装java版本必须和打包的java版本一致 java安装 安装pm2 安装nodejs 通过npm安装pm2 配置json pm2.json {"name": "test01","script": "D:\\jdk-17.0.6\\bin\\java.exe","args": ["-D…

无涯教程-JavaScript - EDATE函数

描述 EDATE函数返回表示日期的序列号,该序列号是在指定日期(start_date)之前或之后的月份数。 使用EDATE来计算到期日或到期日,该到期日或到期日与发行日期在当月的同一天。 语法 EDATE (start_date, months)争论 Argument描述Required/OptionalStart_date 代表开始日期的…

2023年特色小镇行业研究报告

第一章 行业概况 1.1 定义 特色小镇,是指以特定产业、文化、旅游、历史等特色为依托,以小镇为载体,通过优化提升小镇的综合功能和服务能力,形成独特的区域品牌和产业集群,进而推动区域经济社会发展的一种新型城镇化形…

【Unity编辑器扩展】| 顶部菜单栏扩展 MenuItem

前言【Unity编辑器扩展】 | 顶部菜单栏扩展 MenuItem一、创建多级菜单二、创建可使用快捷键的菜单项三、调节菜单显示顺序和可选择性四、创建可被勾选的菜单项五、右键菜单扩展5.1 Hierarchy 右键菜单5.2 Project 右键菜单5.3 Inspector 组件右键菜单六、AddComponentMenu 特性…

AUTOSAR简介及分层架构

这里写目录标题 1、AUTOSAR简介2、AUTOSAR的分层架构2.1、应用软件层(ASW)2.2、运行时环境(RTE)2.3、基础软件层(BSW)2.4、微控制器-MCAL层 1、AUTOSAR简介 AUTOSAR(AUTomotive Open System ARchitecture)是一种为汽车软件开发提供开放化、标准化、可重…

一篇文章教会你SpringMVC

目录 1.什么是SpringMVC 2.SpringMVC工作流程 3.SpringMVC核心组件 4.SpringMVC的配置流程 4.1导入POM依赖 4.2在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml) 4.3 修改web.xml 创建一个Controller用来存放web层的方法和内容 创建一个前端页面用来做测试展示 前言…

一种影像比对快速提取建筑物要素变化的方法

李和军1,2 李 敏3 李楚钰1,2 唐廷元1,2 胡日查4 (1. 北京市测绘设计研究院, 北京, 100038;2. 城市空间信息工程北京市重点实验室, 北京 100038;3. 北京市地质矿产勘查院信息中心, 北京, 100195;4. 内蒙古测绘地理信息中心, 内蒙古 呼和浩特, 010000) 摘 要:本文围绕…

双向交错CCM图腾柱无桥单相PFC学习仿真与实现(4)一些优化总结

前言 上一次说到单相的PFC硬件功能已经实现,THD3.15%满足了国标要求的范围,还是有优化的空间,目前系统设计的是6.6Kw,220V交流输出,400-800V直流输出。目前基本功能完成,但是还有很多细节需要优化&#xf…

飞行动力学 - 第16节-part2-放宽静稳定性 之 基础点摘要

飞行动力学 - 第16节-part2-放宽静稳定性 之 基础点摘要 1. 放宽静稳定性(RSS, Relax Static Stability )2. 纵向增稳器3. 阻力损失4. 参考资料 1. 放宽静稳定性(RSS, Relax Static Stability ) - 稳定飞机:为保证稳定,需要一个抬头力矩,平尾…

软件产品测试报告有哪些测试内容

软件测试内容 随着软硬件技术的发展,计算机领域的应用越来越广泛,软件的功能越来越强大,软件也越来越复杂。计算机软件是计算机应用的核心,其质量与计算机应用系统的成败有关,这使得确保软件的质量和高度可靠性尤为重…

Webpack5入门到原理

Webpack5学习 尚硅谷Webpack5新版视频教程 B站直达:https://www.bilibili.com/video/BV14T4y1z7sw 百度网盘:https://pan.baidu.com/s/114lJRGua2uHBdLq_iVLOOQ 提取码:yyds 阿里云盘:https://www.aliyundrive.com/s/UMkmCzdWsGh&…

【内网穿透】使用Nodejs搭建简单的HTTP服务器 ,并实现公网远程访问

目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation…

mysql 查询优化 、索引失效

查询优化 物理查询优化 通过索引和表连接方式等技术来进行优化,这里重点需要掌握索引的使用 逻辑查询优化 通过SQL 等价变换 提升查询效率,直白一点就是说,换一种查询写法执行效率可能更高 索引失效 计算、函数、类型转换(自动或…

Springboot 实践(12)RabbitMq server 安装调试(Windows环境)

一、准备安装文件 1、下载Erlang 登录网站Downloads - Erlang/OTP,选择“Download Windows installer”,如下图所示: 弹出框中,选在下载保存地址,保存文件,如下图所示: 2、下载RabbitMQ 登录…

Redis 介绍、安装、Redis客户端

目录 redis是什么,他的应用场景是什么? Redis的一些主要特点和应用场景: redis的官方网站:Redis redis是键值型数据库:(也就是key-value模式)(跟python的字典很像) …

利用GitHub实现域名跳转

利用GitHub实现域名跳转 一、注册一个 github账号 你需要注册一个 github账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字. 本文中假设用户名为 UNIT-wuji(也是我的博客名) 地址: https:/…

Android Studio中创建java项目

1.创建普通的android工程 2.创建一个module 3.module类型选择java library 4.填写libary和class的名字 5.生成的工程如图所示 6.然后点击Run --- Edit Configurations... 选择Application选项 设置所需要的参数 选中myjavalib后点击OK。然后打开刚创建的lib的gradle 编辑gradl…

冯诺依曼体系结构/什么是OS?

一、体系结构图 示意图 控制器可以控制其它4个硬件,四个硬件直接可以进行数据传输。 5大硬件 但是这些个体需要用“线”连接。 为什么要有存储器? 如果没有,实际速度则为输入、输出设备的速度。 加上后,变为内存的速度。&#…

java IO流(二) 字符流 缓冲流

字符流 前面学习的字节流虽然可以读取文件中的字节数据,但是如果文件中有中文,使用字节流来读取,就有可能读到半个汉字的情况,这样会导致乱码。虽然使用读取全部字节的方法不会出现乱码,但是如果文件过大又不太合适。…

Docker常用命令以及详解

Docker常用命令以及详解 一、基础命令: docker version 功能:显示 docker 客户端和服务器的版本信息。docker info 功能:显示 docker 系统的详细信息docker --help 功能:显示 Docker 命令的帮助信息。示例输出:这个…