Android 12(S) 图形显示系统 – BufferQueue的工作流程(十)

Android 12(S) 图形显示系统 - BufferQueue的工作流程(十)

BufferQueue是Android Framework层中的一个重要组件,负责管理图形缓存,将SurfaceFlinger和应用程序之间的共享缓存提供了一个通道,是实现多个图形应用程序切换和渲染的关键。本篇文章将介绍Android 12(S)中BufferQueue的工作流程。

BufferQueue概述

BufferQueue是SurfaceFligner和应用程序之间的通道。它提供了一个FIFO队列,应用程序可以将缓冲区入队,SurfaceFlinger可以取出缓冲区进行合成,然后将它们显示在显示屏上。BufferQueue接受三种类型的缓冲区:CPU read-write, GPU read-only, 和 CPU-write GPU-read。

BufferQueue中的两个重要概念

BufferSlot

BufferSlot表示BufferQueue中缓冲区的槽位。对于BufferQueue的每个槽位,都会分配一个缓冲区以及相应的状态信息。BufferSlot有三种状态,FREE,ACQUIRED和QUEUED。

  • FREE:表示缓冲区可用。
  • ACQUIRED:表示缓冲区正在被应用程序读写。
  • QUEUED:表示缓冲区已经入队,在等待SurfaceFlinger取出并渲染。

BufferState

BufferState描述了缓冲区的状态。每个BufferSlot都有一个BufferState对象表示它的缓冲区状态。BufferState有以下几种状态:

  • BUFFER_NEEDS_REALLOCATION:表示需要重新分配缓冲区。
  • BUFFER_NEEDS_REALLOCATION_ON_UPDATE:表示更新时需要重新分配缓冲区。
  • BUFFER_READY:表示缓冲区可被取出渲染。
  • BUFFER_IN_USE:表示缓冲区正在被应用程序读写。

BufferQueue的工作流程

  1. 应用程序创建Surface/GraphicBuffer对象,将GraphicBuffer对象与Surface对象绑定。GraphicBuffer对象包含缓冲区的大小、像素格式等信息。
  2. 应用程序使用Surface对象创建Canvas对象,进行绘图操作。应用程序将绘制得到的缓冲区通过unlockCanvasAndPost()方法提交给BufferQueue。
  3. BufferQueue将提交的缓冲区包装成BufferItem对象,并加入到BufferQueue的队列中。
  4. SurfaceFlinger从BufferQueue的队列中取出缓冲区进行合成,并将合成后的缓冲区发送给DisplayHardware进行显示。

BufferQueue中的同步机制

BufferQueue提供了一些同步机制,以确保多个线程在访问缓冲区时不会发生冲突。

  • 多个应用程序要访问同一个GraphicBuffer时,BufferQueue使用SurfaceTexture来提供同步访问。
  • 应用程序访问缓冲区时,BufferQueue使用Fence来保障访问的同步。
  • SurfaceFlinger访问缓冲区时,BufferQueue同样使用Fence来保障访问的同步。

总结

BufferQueue是Android Framework层中非常重要的一个组件,它实现了SurfaceFlinger和应用程序之间对图形缓存的共享。BufferQueue的两个重要概念BufferSlot和BufferState,描述了缓冲区的槽位和状态信息。BufferQueue的同步机制使用SurfaceTexture来提供同步访问,使用Fence来保障访问的同步。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android 12(S) 图形显示系统 – BufferQueue的工作流程(十) - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • 解决DCEF3 在 BeforePopup 事件中打开新窗体的问题

    解决DCEF3 在 BeforePopup 事件中打开新窗体的问题 最近在使用 DCEF3 插件开发浏览器时,遇到了一个问题。在编写 BeforePopup 事件的处理代码时,想要打开一个新窗体,但发现并没有生效。经过一番调查和实验,终于找到了解决方案。 问题描述 在 DCEF3 中,BeforePopup 事件可以用于拦截新窗口的打开,并根据需要进行一些处…

    其他 2023年3月28日
    00
  • Android程序开发之自定义设置TabHost,TabWidget样式

    Android程序开发之自定义设置TabHost,TabWidget样式攻略 在Android应用程序开发中,TabHost和TabWidget是常用的UI组件,用于创建具有多个选项卡的界面。本攻略将详细介绍如何自定义设置TabHost和TabWidget的样式。 步骤一:创建TabHost和TabWidget 首先,在XML布局文件中创建TabHost和T…

    other 2023年9月6日
    00
  • 关于keep-alive路由多级嵌套不生效的解决方案

    关于keep-alive路由多级嵌套不生效的解决方案 在Vue.js中,<keep-alive>组件用于缓存组件实例,以便在组件切换时保留其状态。然而,当使用多级嵌套路由时,有时候<keep-alive>组件可能无法正常工作。下面是解决这个问题的完整攻略。 问题描述 当我们在多级嵌套路由中使用<keep-alive>组件时…

    other 2023年7月28日
    00
  • 微信公众平台如何获取用户的openid(一)

    微信公众平台如何获取用户的openid(一) 在开始介绍如何获取用户的openid之前,首先需要了解openid是什么。OpenID是一个基于OAuth 2.0授权协议的身份认证标准。在微信公众平台中,openid用于区分不同用户的身份,并且可以作为用户的唯一标识识别用户。 为了获取用户的openid,我们需要使用微信公众平台提供的网页授权机制。在网页授权机…

    其他 2023年3月28日
    00
  • 魔兽世界7.2.5射击猎怎么堆属性 wow7.25射击猎配装属性优先级攻略

    魔兽世界7.2.5射击猎配装属性优先级攻略 射击猎作为一个远程输出职业,在进行配装时需要重点关注一些属性以达到最高的输出效果。那么在魔兽世界7.2.5版本中,射击猎应该如何进行属性堆叠呢?以下就是针对7.2.5版本射击猎配装属性优先级攻略的详细说明: 1. 总体要求 首先,射击猎在进行配装时需要注意以下几个方面: 尽量保证爆发能力,即在短时间内输出尽量高的伤…

    other 2023年6月27日
    00
  • SpringBoot如何读取配置文件中的数据到map和list

    首先,我们需要在SpringBoot项目中引入配置文件。SpringBoot提供了一个默认的application.yml或application.properties文件来存储配置信息。 在application.yml文件中,我们可以使用如下形式定义一个Map: map-config: key1: value1 key2: value2 key3: va…

    other 2023年6月25日
    00
  • mathcad 15怎么安装?PTC Mathcad 15.0 M050破解版安装教程图文详解

    Mathcad是一款用于工程、科技等领域计算和分析的软件,而PTC Mathcad 15.0 M050是其中的一个版本,下面为大家详细讲解如何安装。 下载软件 首先需要下载PTC Mathcad 15.0 M050破解版的安装文件,可以在一些软件下载站进行下载。下载完成后,解压软件压缩包。 安装Mathcad 15 进入解压后的文件夹,找到“Mathcad_…

    other 2023年6月27日
    00
  • 一个封装js代码—–展开收起效果示例

    我来给你详细讲解一下。 封装js代码展开收起效果 有时我们需要在网页中展示大段的文本内容,但是又希望页面不显得太长,可以通过展开/收起的方式来达到更好的用户体验。这里我们可以通过封装一段JS代码来实现展开收起效果。 HTML部分 首先,在HTML中需要编写展开/收起的按钮和展开/收起的区块。以下是一个简单的示例: <div class="co…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部