Android中 BufferQueue 和 Gralloc

这篇具有很好参考价值的文章主要介绍了Android中 BufferQueue 和 Gralloc。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

零、本篇讨论范围

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

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

Android中 BufferQueue 和 Gralloc,android,BufferQueue,Gralloc

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

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

Android中 BufferQueue 和 Gralloc,android,BufferQueue,Gralloc
上图为 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的内存首地址。
与上一节最后呼应。文章来源地址https://www.toymoban.com/news/detail-718321.html

到了这里,关于Android中 BufferQueue 和 Gralloc的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android】Android虚拟机

    Android的虚拟机主要有两种: Dalvik 虚拟机 和 ART(Android Runtime)虚拟机 。 Dalvik 虚拟机 Dalvik 虚拟机是 Android 早期使用的虚拟机,它 基于寄存器架构 。从Android 2.2版本开始,支持 JIT即时编译(Just In Time) 在程序运行的过程中进行选择热点代码(经常执行的代码)进行编译或者

    2024年02月07日
    浏览(40)
  • Android版本API对应表(Android9.0-Android 14.0)

    Android 14(API 级别 34) Android 13(API 级别 33) Android 12(API 级别 31、32) Android 11(API 级别 30) Android 10(API 级别 29) Android 9(API 级别 28) 参考文档

    2024年02月02日
    浏览(38)
  • [Android] Android架构体系(1)

    Android 取得成功的关键因素之一就是它丰富的框架集。 没有这些框架,Android 可能会和其他一些嵌入式 Linux 发布版本一样混得很差。 通过提供各种框架,Android 让应用可以很方便地创建进程,允许开发者使用高级的 Java 语言而不是底层的 C/C++语言进行编程。各种框架的不断增加

    2024年01月18日
    浏览(37)
  • [Android] Android架构体系(2)

    [Android] Android架构体系(1) 抛开合法性问题不提,相对于GLibC,Bionic 也可以算是非常轻量级的了,而且对于Android所要达成的目标,Bionic 也更为有效。Bionic 中去掉的下列这些特性的原因或是认为没有必要或是认为太过复杂。 由于系统用是使用得非常频繁的,所以 Boinic 想要通过

    2024年01月19日
    浏览(105)
  • Android开发-Android开发环境搭建(Android Studio详细安装教程,适合新手)

    01 Android开发工具 Android Studio Android Studio是谷歌推出的一个Android集成开发工具, 基于 IntelliJ IDEA .类似Eclipse ADT, Android Studio提供了集成的Android开发工具用于开发和调试 架构组成 。基于Gradle的构建支持 。Android专属的重构和快速修复 。提示工具以捕获性能、可用性、版本兼容性

    2024年02月09日
    浏览(46)
  • Android反射@hide API 方法、变量,支持Android11和Android12

    Android源码中现在有大量的方法和变量被@hide所修饰,而这些被hide修饰的方法和变量是不允许应用层进行反射获取的,所以富有探索精神的程序员们就开始想尽各种办法绕过系统hide限制来使用@hide修饰的方法和变量。 Android11之前 我们可以使用套娃的形式来欺骗系统,让系统误

    2024年02月11日
    浏览(65)
  • Android多屏幕支持-Android12

    android12-release AOSP 文档 心主题 多屏幕概览 术语 在这些文章中,主屏幕和辅助屏幕的定义如下: 主(默认)屏幕的 屏幕 ID 为 DEFAULT_DISPLAY 辅助屏幕的 屏幕 ID 不是 DEFAULT_DISPLAY 主题区域 文章 开发和测试 推荐做法 测试和开发环境 常见问题解答 相关文章集 显示 系统装饰支持

    2024年02月13日
    浏览(39)
  • Android开发--实现Android引导页

    几乎每个app都有引导页,下面我们来做一个引导页的实现。 引导页,是指软件首次进入或者更新完成后,软件显示的页面,一般展示软件特色功能或者更新的内容。 先判断是否第一次启动app,如果是,则进入引导页(左右滑动切换查看,滑动到最后一页点击按钮进入首页)。

    2024年02月08日
    浏览(35)
  • Android studio案例Android商城

      本篇文章只是因为做出作业太激动才写的,没什么技术含量,尽量写的通俗易懂一些只是为了能做出来。 1.新建一个新的项目 File-New Project-(取名字)next-next-(选择Empty Activity)next-(取消勾选第二个,如图)Finish  2.点击app-src-main-res-layout-activity_main.xml  在左下角Text中复制如

    2024年02月09日
    浏览(38)
  • Android权限列表(基于Android 14)

    权限的目的为了保护用户隐私,应用在访问一些敏感数据时,必须事先取得用户授权后才能使用,比如:比如读取sdcard、访问通讯录等。 在Android6.0之前的设备上,系统不会提醒用户正在获取的权限。一旦安装应用,就意味着该应用所需的所有权限均已经得到授权。在这种情

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包