Android图形-组件-比较与理解

目录

引言

BufferQueue 和 Gralloc

概念

源码位置:

图形缓冲区的流转情况:

BufferQueue 的特性:

BufferQueue的跟踪工具-systrace:

Gralloc

受保护的缓冲区

Surface 和 SurfaceHolder

Canvas rendering

SurfaceHolder

SurfaceView 和 GLSurfaceView

类的继承:

SurfaceView 和 TextureView的区别

SurfaceFlinger 和 WindowManager

概念

Surfaceflinger

WindowManager


引言

从架构层面大致了解Android图形的概览,接下来先对一些组件进行更具体深入的理解

BufferQueue 和 Gralloc
Surface 和 SurfaceHolder
SurfaceView 和 GLSurfaceView
SurfaceFlinger 和 WindowManager

BufferQueue 和 Gralloc

概念

Bufferqueue :连接 图像流的生产者和消费者,几乎所有的图形数据缓冲区的内容都依赖于BufferQueue
Gralloc 内存分配器会进行缓冲区分配,并通过两个特定于供应商的 HIDL 接口来进行实现。

源码位置:

hardware/interfaces/graphics/allocator/

hardware/interfaces/graphics/mapper/

allocate() 函数采用预期的参数(宽度、高度、像素格式)以及一组用法标志。

图形缓冲区的流转情况:

主要是在生产者和消费者模型中,对BufferQueue的操作,伴随者缓冲区的流转。包括生产者对缓冲区的出列入列操作,消费者对缓冲区的获取和释放操作。

1)消费者创建并拥有BufferQueue的数据结构,并且可以存在与其他生产者不同的进程中
2)dequeueBuffer():生产者从 BufferQueue 请求一个可用的缓冲区,并指定缓冲区的宽度、高度、像素格式和用法标志
3)queueBuffer():生产者填充好缓冲区后,调用该函数将缓冲区返回到队列。
4)acquireBuffer():消费者获取缓冲区并使用缓冲区的内容
5)releaseBuffer():消费者用完缓冲区后,调用改函数将缓冲区返回到队列。
注意:同步框架可控制缓冲区在 Android 图形pipeline中移动的方式。

BufferQueue 的特性:

1)如果生产者请求具有不同大小的缓冲区,系统会释放旧的缓冲区,并根据需要分配新的缓冲区。
2)缓冲区始终通过句柄进行传递而不是通过复制的方式来进行传递。

BufferQueue的跟踪工具-systrace:

1)如需了解图形缓冲区如何移动,请使用 Systrace。系统级的图形代码插入了埋点信息都经过充分检测的。
2)启用gfx、view 和 sched 标记。如:$ python systrace.py -o mynewtrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

Gralloc

Gralloc 分配器 HAL

头文件路径:hardware/libhardware/include/hardware/gralloc.h

通过用法标志执行缓冲区分配。
用法标志包括以下属性:
1)从软件 (CPU) 访问内存的频率
2)从硬件 (GPU) 访问内存的频率
3)是否将内存用作 OpenGL ES (GLES) 纹理
4)视频编码器是否会使用内存

受保护的缓冲区

Gralloc 用法标志 GRALLOC_USAGE_PROTECTED 允许仅通过受硬件保护的路径显示图形缓冲区。这些叠加平面是显示 DRM (Digital Rights Management数字版权管理)内容的唯一途径(SurfaceFlinger 或 OpenGL ES 驱动程序无法访问受 DRM 保护的缓冲区)。受 DRM 保护的视频只能在叠加平面上呈现。支持受保护内容的视频播放器必须使用 SurfaceView实现。在不受保护的硬件上运行的软件无法读取或写入缓冲区;受硬件保护的路径必须显示在硬件混合渲染器叠加层上(也就是说,如果硬件混合渲染器切换到 OpenGL ES 合成,受保护的视频将从屏幕中消失)。

Surface 和 SurfaceHolder

概念

应用的图像要显示到屏幕上,需要先在Surface对象上进行渲染

SurfaceHolder接口就可以编辑和控制Surface的大小,格式等。

Java的类继承:

public class Surface
extends Object implements Parcelablejava.lang.Objectandroid.view.Surface
public interface SurfaceHolderandroid.view.SurfaceHolder

大多数客户端使用 OpenGL ES 或 Vulkan 渲染到 Surface 上。但是,有些客户端使用 Canvas 渲染到 Surface 上

Canvas rendering

Canvas由Skia图形库提供。

带锁的Canvas:
1)lockCanvas() 可锁定缓冲区以在 CPU 上渲染,并返回用于绘图的画布。
2)unlockCanvasAndPost() 可解锁缓冲区并将其发送到合成器。
3)lockHardwareCanvas() 可锁定缓冲区以在 GPU 上渲染,并返回用于绘图的画布。
注意:当应用通过 lockCanvas() 锁定 Surface 时,所获得的画布一概不会获得硬件加速。
注意:如果您曾调用过 lockCanvas(),则无法使用 GLES 在 Surface 上绘图或从视频解码器向其发送帧。lockCanvas() 会将 CPU 渲染程序连接到 BufferQueue 的生产方,直到 Surface 被销毁时才会断开连接。与大多数生产方(如 GLES 或 Vulkan)不同,基于画布的 CPU 渲染程序无法在断开连接后重新连接到 Surface。
 

SurfaceHolder

SurfaceHolder 是系统用于与应用共享 Surface 所有权的接口。
与 Surface 配合使用的一些客户端需要 SurfaceHolder,因为用于获取和设置 Surface 参数的 API 是通过 SurfaceHolder 实现的。
一个 SurfaceView 包含一个 SurfaceHolder。
与 View 交互的大多数组件都涉及到 SurfaceHolder。
一些其他 API(如 MediaCodec)将在 Surface 本身上运行。

SurfaceView 和 GLSurfaceView

类的继承:

public class View
extends Object implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSourcejava.lang.Object↳	android.view.View
public class SurfaceView
extends Viewjava.lang.Object↳	android.view.View↳	android.view.SurfaceView

如需在创建或销毁 Surface 时收到回调,请使用 SurfaceHolder 接口。
默认情况下,新创建的 Surface 放置在应用界面 Surface 的后面。您可以替换默认的 Z 轴顺序,将新的 Surface 放在前面。
在需要渲染到单独的 Surface(例如,使用 Camera API 或 OpenGL ES 上下文进行渲染)时,使用 SurfaceView 进行渲染很有帮助。
使用 SurfaceView 进行渲染时,SurfaceFlinger 会直接将缓冲区合成到屏幕上。
使用 SurfaceView 进行渲染后,请使用界面线程与 activity 生命周期相协调,并根据需要调整 View 的大小或位置。然后,HWC会将应用界面与其他层混合在一起。

SurfaceView 和 TextureView的区别

public class TextureView
extends Viewjava.lang.Object↳	android.view.View↳	android.view.TextureView

SurfaceView 采用与其他 View 相同的参数,但 SurfaceView 内容在呈现时是透明的。
TextureView使用OpenGLES渲染

TextureView 具有更出色的 Alpha 版和旋转处理能力,但在视频上以分层方式合成界面元素时,SurfaceView 具有性能方面的优势。
当客户端使用 SurfaceView 呈现内容时,SurfaceView 会为客户端提供单独的合成层。如果设备支持,SurfaceFlinger 会将单独的层合成为硬件叠加层。
当客户端使用 TextureView 呈现内容时,界面工具包会使用 GPU 将 TextureView 的内容合成到视图层次结构中。
对内容进行的更新可能会导致其他 View 元素重绘,例如,在其他 View 被置于 TextureView 顶部时。View 呈现完成后,SurfaceFlinger 会合成应用界面层和所有其他层,以便每个可见像素合成两次。
注意:受 DRM 保护的视频只能在叠加平面上呈现。支持受保护内容的视频播放器必须使用 SurfaceView 实现。

SurfaceFlinger 和 WindowManager

概念

Surfaceflinger接受缓冲区,对他们进行合成,然后发送到屏幕。
WindowManager为Surfaceflinger提供缓冲区和窗口Metadata,Surfaceflinger可以使用这些信息将Surface合成到屏幕

Surfaceflinger

在收集可见层的所有缓冲区后,便会询问HWC如何进行合成。如果HWC将层合成类型标记为Client合成,则Surfaceflinger将合成这些层,然后Surfaceflinger会将输出缓冲区传递给HWC

WindowManager

WindowManager会控制window对象,他们是用于容纳view的对象容器。window对象始终由Surface对象提供支持。
WindowManager会监督生命周期,输入和聚焦事件,屏幕方向,转换,动画,位置,Z轴顺序以及窗口的许多方面。
WindowManager会将所有窗口的Metadata发送到Surfaceflinger

public abstract class Window
extends Objectjava.lang.Object↳	android.view.Window

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

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

相关文章

【C++基础】4. 变量

文章目录 【 1. 变量的定义 】【 2. 变量的声明 】示例 【 3. 左值和右值 】 变量:相当于是程序可操作的数据存储区的名称。在 C 中,有多种变量类型可用于存储不同种类的数据。C 中每个变量都有指定的类型,类型决定了变量存储的大小和布局&am…

Jenkins实现基础CD操作

操作截图 在Jenkins里面设置通过标签进行构建 在Jenkins中进入项目,配置以下 将execute shell换到invoke top-level maven targets之前 在gitlab中配置标签 代码迭代新的版本 项目代码迭代 修改docker-compose.yml 提交新版本的代码 在Jenkins中追加新…

有趣的前端面试题

1、nums 的值是多少&#xff1f; 请问输出是什么&#xff1f; const len 5const nums []for (var i 0; i < len; i);{ nums.push(i 1)} console.log(nums) 分析与解答 首先&#xff0c;我认为这个问题并不是考察应聘者的编程能力。他正在检查候选人是否有眼睛方面的…

【Spring Boot】分页

分页查询 分页查询是日常开发中比较常用的功能。MyBatis框架下也有很多插件实现分页功能&#xff0c;比如pageHelper。这是一款非常简单、易用的分页插件&#xff0c;能很好地集成在Spring Boot中。pageHelper是一款基于MyBatis的数据库分页插件&#xff0c;所以我们在使用它时…

第5节-PhotoShop基础课程-颜色模式

文章目录 前言1. 色彩的常用模式1位图模式1.位图模式 2. 灰度模式1.如何把图像变为灰色2.灰度模式下是无法画出彩色的 3. RGB模式4.CMYK模式1.cyan 青色2.magenta平红色3.yellow 黄色4.黑色 5.LAB模式6.颜色空间 6.颜色填充1.色彩基础1.色相 H 2.拾色器3.颜色填充4.前后背景颜色…

【Cisco Packet Tracer】管理方式,命令,接口trunk,VLAN

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

软件设计师(十)网络与信息安全基础知识

计算机网络是由多台计算机组成的系统&#xff0c;与传统的单机系统、多机系统相比有很大的区别。 一、网络概述 计算机网络是计算机技术与通信技术相结合的产物&#xff0c;它实现了远程通信、远程信息处理和资源共享。 1、计算机网络的概念 计算机网络的定义是利用通信设备…

数学建模--时间序列预测模型的七种经典算法的Python实现

目录 1.开篇版权提示 2.时间序列介绍 3.项目数据处理 4.项目数据划分可视化 5.时间预测序列经典算法1&#xff1a;朴素法 6.时间预测序列经典算法2&#xff1a; 简单平均法 7.时间预测序列经典算法3&#xff1a;移动平均法 8.时间预测序列经典算法4&#xff1a;简单指…

C++学习记录——삼십이 C++IO流

文章目录 1、C标准IO流2、C文件IO流1、二进制读写2、文本读写 3、stringstream 1、C标准IO流 C语言的printf和scanf无法很好的输入输出自定义类型&#xff0c;且还需要程序员自己确定类型&#xff0c;所以C就引入了输入流和输出流&#xff0c;是设备和内存之间的沟通。 其实io…

Matlab信号处理2:方波信号的合成与分解

周期信号可展开为傅里叶级数&#xff0c;因此方波信号可用若干谐波去拟合。以下是Matlab的实现&#xff1a; %% 方波信号的分解% 1.生成方波信号 % 方波信号周期、基波频率 T0 2; w0 (2 * pi) / T0; % 方波信号值为1的区间 T1 0.5; % 绘图周期&#xff1a;(2*n1)个周期 n …

java利用aop来记录接口的请求耗时、请求参数、请求url等详细信息

最近在项目里面需要对一些controller接口进行记录。记录的信息包括&#xff0c;接口的耗时、请求参数、请求url、是否成功、请求的ip地址。 最后利用aop切面编程。 Order(1) Aspect Component Slf4j public class BehaviorAop {AutowiredBehaviorService behaviorService;/**…

C语言结构体的初始化方式

逐个初始化字段&#xff1a;这是最直接的方式&#xff0c;你可以逐个为结构体的每个字段进行初始化。 struct Student { char name[50]; int age; float marks; }; struct Student student1 {"Alice", 20, 89.5}; 2.使用结构体字面值初始化&#xff1a;这种方…

Elasticsearch 分布式搜索——聚合

1.聚合的种类 聚合常见的有三类&#xff1a; **桶&#xff08;Bucket&#xff09;**聚合&#xff1a;用来对文档做分组 TermAggregation&#xff1a;按照文档字段值分组&#xff0c;例如按照品牌值分组、按照国家分组Date Histogram&#xff1a;按照日期阶梯分组&#xff0c;例…

用户忠诚度:小程序积分商城的用户保持方法

随着移动互联网的蓬勃发展&#xff0c;小程序积分商城已经成为了许多企业私域营销的热门选择。这个商城不仅可以吸引用户参与&#xff0c;还可以提高用户的忠诚度&#xff0c;进一步加深用户与品牌的互动关系。然而&#xff0c;要实现用户的忠诚度&#xff0c;需要一系列的策略…

C++的内存管理是怎样的?

目录 C的内存管理代码段数据段BSS段堆区映射区栈区 C的内存管理 在C中&#xff0c;虚拟内存分为代码段、数据段、BSS段、堆区、文件映射区、栈区六部分&#xff1a; 代码段 包括只读存储区和文本区&#xff0c;其中只读存储区存储字符串常量,文本区存储程序的机器代码。 数据…

生信豆芽菜-机器学习筛选特征基因

网址&#xff1a;http://www.sxdyc.com/mlscreenfeature 一、使用方法 1、准备数据 第一个文件&#xff1a;特征表达数据 第二个文件&#xff1a;分组信息&#xff0c;第一列为样本名&#xff0c;第二列为患者分组 第三个文件&#xff1a;分析基因名 2、选择机器学习的方…

【C语言】入门——结构体

目录 结构体 为什么有结构体&#xff1f; 1.结构体的声明 1.2结构体变量的访问和初始化 2.结构体成员的访问 结构体 struct 结构体类型 {//相关属性; }结构体变量; 结构体和数组不同&#xff0c;同一类型的数据的集合是数组&#xff1b; 结构体是多种类型的数据的集合&…

使用GPT-4生成训练数据微调GPT-3.5 RAG管道

OpenAI在2023年8月22日宣布&#xff0c;现在可以对GPT-3.5 Turbo进行微调了。也就是说&#xff0c;我们可以自定义自己的模型了。然后LlamaIndex就发布了0.8.7版本&#xff0c;集成了微调OpenAI gpt-3.5 turbo的功能 也就是说&#xff0c;我们现在可以使用GPT-4生成训练数据&a…

被百度判定为低质量网站了!如何整改?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 先说结论&#xff1a;接受现实&#xff0c;不要幻想百度恢复了! 百度自9月初大批量删除百度资源平台权限以来&#xff0c;几乎90%(未经证实**&#xff0c;但数量确实不小)的网站都被取消了权限&am…

vue3中的reactive赋值问题

问题 当通过方法对reactive变量修改的时候&#xff0c;发现页面上的值没有及时更新&#xff1f; 解决方法 具体原因: 上面这样赋值检测不到&#xff0c;因为响应式的是它的属性&#xff0c;而不是它自身. 方法1: 单个赋值 如下&#xff1a; let obj reactive({name: zha…