Android中 BufferQueue 和 Gralloc

目录

  • 零、本篇讨论范围
  • 一、图片数据流的生产者与消费者
    • 1.1 生产者
    • 1.2 消费者
  • 二、生产者与消费者间数据的传递
    • 2.1 BufferQueue
    • 2.2 Gralloc

零、本篇讨论范围

接上篇 SurfaceFlinger做Layer合成时,如何与HAL层进行交互 后:

本篇的讨论范围如下图红框中所示:这回关注的是 图片流的生产者与消费者间数据怎么传递的。

在这里插入图片描述

一、图片数据流的生产者与消费者

1.1 生产者

如图上面红框所示:
包含了 MediaPlayer,Camera Preview,NDK,OpenGL ES、Canvas 2D 和 mediaserver 视频解码器。

1.2 消费者

如图下面红框所示:
图像流的最常见的消费者是 SurfaceFlinger,该系统服务会消费当前可见的 Surface,并使用窗口管理器中提供的信息将它们合成到屏幕。SurfaceFlinger 是可以修改所显示部分内容的唯一服务。SurfaceFlinger 使用 OpenGL 和 Hardware Composer 来合成一组 Surface。
OpenGL ES 应用也可以消耗图像流,例如相机应用会消耗相机预览图像流。

二、生产者与消费者间数据的传递

2.1 BufferQueue

BufferQueue 通信过程
上图为 BufferQueue 通信过程。
BufferQueue 是将缓冲区池与队列相结合的数据结构,它使用 Binder IPC 在进程之间传递缓冲区。

使用方创建并拥有 BufferQueue 数据结构,并且可存在于与其生产方不同的进程中。当生产方需要缓冲区时,它会通过调用 dequeueBuffer() 从 BufferQueue 请求一个可用的缓冲区,并指定缓冲区的宽度、高度、像素格式和用法标志。(这个上一篇提到过,其实就是 FrameBuffer,Gralloc中分配显存时,也提到过)

然后,生产方填充缓冲区并通过调用 queueBuffer() 将缓冲区返回到队列。接下来,使用方通过 acquireBuffer() 获取该缓冲区并使用该缓冲区的内容。当使用方操作完成后,它会通过调用 releaseBuffer() 将该缓冲区返回到队列。同步框架可控制缓冲区在 Android 图形管道中移动的方式。

BufferQueue 的一些特性(例如可以容纳的最大缓冲区数)由生产方和使用方联合决定。但是,BufferQueue 会根据需要分配缓冲区。除非特性发生变化,否则将会保留缓冲区;例如,如果生产方请求具有不同大小的缓冲区,系统会释放旧的缓冲区,并根据需要分配新的缓冲区。

注意:BufferQueue 永远不会复制缓冲区内容,因为移动如此多的数据是非常低效的操作。相反,缓冲区始终通过句柄进行传递。

2.2 Gralloc

Gralloc 分配器 HAL(源码路径:hardware/libhardware/include/hardware/gralloc.h)根据用途标志 执行缓冲区分配。用途标志包括以下属性:(不仅仅这几种哈,上一篇也提到过)

  • 从软件 (CPU) 访问内存的频率
  • 从硬件 (GPU) 访问内存的频率
  • 是否将内存用作 OpenGL ES (GLES) 纹理
  • 视频编码器是否会使用内存

例如,如果生产者的缓冲区格式指定 RGBA_8888 像素,并且生产者指明将从软件访问缓冲区(这意味着应用将在 CPU 上触摸像素),则 Gralloc 将按照 R-G-B-A 的顺序为每个像素创建 4 个字节的缓冲区。如果情况相反,生产者指明仅从硬件访问其缓冲区且缓冲区作为 GLES 纹理,Gralloc 可以执行 GLES 驱动程序所需的任何操作(比如 BGRA 排序、非线性搅和布局和替代颜色格式等)。允许硬件使用其首选格式可以提高性能。

某些值在特定平台上无法组合。例如,视频编码器标志可能需要 YUV 像素,因此将无法添加软件访问权限并指定RGBA_8888。

Gralloc 返回的句柄可以通过 Binder 在进程之间进行传递。我猜测,这个句柄就是FrameBuffer的内存首地址。
与上一节最后呼应。

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

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

相关文章

2023辽宁省赛E

Solution 题目大致分为三个步骤 计算 P ( S ) P(S) P(S)证明删除区间连续且找到最值位置根据最值位置求出答案 接下来过程中不合法的组合数都默认为 0 0 0 第 1 步 - 求出总值 考虑 S m { 1 , 2 , ⋯ , m } S_m \{1, 2, \cdots, m\} Sm​{1,2,⋯,m} , 则有 $P(S_{n2}…

2024年天津中德应用技术大学专升本物流管理专业课考试大纲

天津中德应用技术大学物流管理专业(高职升本科)2024年专业基础考试大纲 一、试卷类型 物流管理专业升本专业课考试共1套试卷,总分200分,考试时间为2小时。内容包含仓储与配送管理40%、物流基础30%,运输管理30%&#…

阿里云服务器—ECS快速入门

这里对标阿里云的课程,一步步学习,链接在下面,学习完考试及格即可获取阿里云开发认证和领取证书,大家可以看看这个,这里我当作笔记,记一下提升印象! 内容很长,请耐心看完&#xff0…

Wpf 使用 Prism 实战开发Day01

一.开发环境准备 1. VisualStudio 2022 2. .NET SDK 7.0 3. Prism 版本 8.1.97 以上环境,如有新的版本,可自行选择安装新的版本为主 二.创建Wpf项目 1.项目的名称:MyToDo 项目名称:这里只是记录学习,所以随便命名都无所谓,只要觉得合理就…

React-快速搭建开发环境

1.安装 说明:react-excise-01是创建的文件名 npx create-react-app react-excise-01 2. 打开文件 说明:we suggest that you begin by typing:下面即是步骤。 cd react-excise-01 npm start 3.显示

信息学奥赛一本通-编程启蒙3006:【例3.2】 打印长方形

时间限制: 1000 ms 内存限制: 65536 KB 提交数: 11968 通过数: 6384 【题目描述】 在windows的控制台环境中所有的字符都是等宽的,默认情况下窗口中每行有 80 个字符,每个屏幕有 25 行,组成了一个字符矩阵。利用控制台的这个特点…

07、SpringCloud -- jmeter 压测

目录 jmeter 入门jmeter 安装测试步骤测试数据模拟多用户操作1、创建http请求2、添加http cookie 管理器3、并发获取当前登录用户数据的效果4、添加多个用户模拟并发请求5、访问方法6、jmeter添加 CSV Data Set Config7、高并发执行访问的效果8、总结流程高并发秒杀压测jmeter …

Postman的高级使用,傻瓜式学习【下】

目录 前言 1、全局变量、环境变量 1.1、概念: 1.2、如何设置全局变量、环境变量 1.3、获取全局变量、环境变量 1.4、案例1:手动设置变量,请求参数获取 1.5、案例2:代码设置变量,代码获取变量 2、Postman读取外部…

win10虚拟机安装教程

目录 1、安装VMware 10、12、16都可以,看个人选择 2、开始安装系统(以vm16为例) 3、在虚拟机中安装win10 完成 1、安装VMware 10、12、16都可以,看个人选择 下面链是我虚拟机安装包,需要可以下载。 YR云盘 软件安…

HTTP 响应状态码介绍

HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。响应被归为以下五大类: 1xx 信息响应 (100–199) 2xx 成功响应 (200–299) 3xx 重定向消息 (300–399) 4xx 客户端错误响应 (400–499) 5xx 服务端错误响应 (500–599)1xx 信息响应 100 Continue 这个临时响应…

二叉树的后续遍历(迭代法)

迭代法实现二叉树的后续遍历 1、递归版本 public static void dfs(TreeNode root){if(rootnull){return;}if(root.left!null)dfs(root.left);if(root.right!null)dfs(root.right);System.out.println(root.val); }从递归版本可以看出我们第一步需要遍历完所有的左节点 这里我…

字符串原型方法

常见有34种(去除已经弃掉的方法): String.prototype.at()String.prototype.charAt()String.prototype.charCodeAt()String.prototype.codePointAt()String.prototype.concat()String.prototype.endsWith()String.prototype.includes()String…

树莓派基金会近日发布了新版基于 Debian 的树莓派操作系统

树莓派基金会(Raspberry Pi Foundation)近日发布了新版基于 Debian 的树莓派操作系统(Raspberry Pi OS),为树莓派单板电脑带来了新的书虫基础和一些重大变化。 新版 Raspberry Pi OS 的最大变化是它现在基于最新的 Deb…

git基本命令

gti stash使用场景 切换分支: git stash可以将但当前修改保存起来,之后可以直接切换分支开始其他分支的操作 合并代码: git stash保存当前分支修改,切换其他分支执行更新合并操作后, 切换之前的分支后通过 git stash pop来获取栈顶保存的修改来恢复到之前的修改 代码审查: 在…

【表面缺陷检测】钢轨表面缺陷检测数据集介绍(2类,含xml标签文件)

一、介绍 钢轨表面缺陷检测是指通过使用各种技术手段和设备,对钢轨表面进行检查和测量,以确定是否存在裂纹、掉块、剥离、锈蚀等缺陷的过程。这些缺陷可能会对铁路运输的安全和稳定性产生影响,因此及时进行检测和修复非常重要。钢轨表面缺陷…

[架构之路-243]:目标系统 - 纵向分层 - 架构是表面轮廓、内部骨架、未来蓝图,企业组织架构、信息系统架构、软件架构、应用程序就架构

目录 一、什么是架构 1.1 架构是表面轮廓 1.2 架构是内部骨架 1.3 架构是蓝图,是愿景 1.4 架构是数据流、控制流、管理流、同步流 1.5 数据、控制、同步、管理的比较 二、架构的层级 2.1 企业组织架构 2.2 企业系统架构 2.2 信息系统架构 2.3 软件架构 …

SpringMVC系列-6 异常处理器

背景 本文作为 SpringMVC系列 的第六篇,介绍SpringMVC的异常处理器。内容包括异常处理器的使用方式、实现原理和内置异常处理器的装配过程。 1.使用方式 自定义异常类,用于异常处理器: public class ClientException extends RuntimeExce…

CTF-php特性绕过

注意&#xff1a;null0 正确 nullflase 错误 Extract变量覆盖 <?php$flagxxx; extract($_GET);if(isset($shiyan)){ $contenttrim(file_get_contents($flag));//trim移除引号if($shiyan$content){ echoctf{xxx}; }else{ echoOh.no;} }?> extract() 函数从数组中将…

react中的函数柯里化

函数柯里化是一种将接受多个参数的函数转化为一系列接受单一参数的函数的技术。在React开发中&#xff0c;函数柯里化可以帮助我们更好地组织组件的代码&#xff0c;使其具有更好的可读性和可复用性。 一个简单的函数柯里化示例&#xff1a; function add(a) {return functio…

主流大语言模型的技术细节

主流大语言模型的技术原理细节从预训练到微调https://mp.weixin.qq.com/s/P1enjLqH-UWNy7uaIviWRA 比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节&#xff1a;tokenizer、位置编码、Layer Normalization、激活函数等。2. 大语言模型的分布式训练技术&#xff1a;数据并行、…