Android图形-合成与显示-概论

目录

引言

概念与理解

SurfaceFlinger

Surface

HWC

Fence:

Gralloc:

DisplayDevice


引言

Activity是Android的主要UI相关组件。通过View的相关类和接口实现,在WMS的管理下,进行窗口和控件的测量,布局和绘制,形成的图层交给SurfaceFlinger进行合成渲染,然后提供给屏幕进行显示

概念与理解

SurfaceFlinger

是Android图形的大总管,负责管理图形的合成与渲染。

SurfaceFlinger会依赖多个线程来实现完成其合成渲染的功能。这些线程也是实现Vsync机制的框架的线程。换句话说,SurfaceFlinger主要是依赖于Vsync机制来实现流水线的方式管理Android图形的合成与渲染。首先Vsync可以是由硬件产生,也可以由软件来产生,硬件产生Vsync的实体叫做:HWComposer,软件的产生Vsync的实体叫做:VsyncThread。在SurfaceFlinger启动main函数初始化阶段,还会创建一个DispVsyncThread,用于将Vsync信号一分为二,分别提供给SF和APP。产生这两个vsync信号的叫做EventThread-sf和EventThread-app

Surface

可以理解为一个canvas的画布,可以利用skia库进行绘制。一个窗口就对应一个Surface

Android显示的基本流程是:

1)创建一个SurfaceFlinger的客户端SurfaceComposerClient,通过这个客户端创建一个Surface,同时获取一个SurfaceControl

2)SurfaceControl设置Layer层数,Surface获取buffer

3)锁定Buffer并写入buffer

4)提交buffer,由屏幕进行刷新显示

HWC

HWC:hwcomposer,是Android系统进行窗口合成显示的HAL层模块,通常是由显示设备制造商OEM实现并完成,为SurfaceFlinger服务提供硬件支持

HWC对Layer进行合成属于硬件操作,可以减轻GPU合成负担,这两种合成方式被称作:Device与Client。

HWC的合成流程大概是:

1)SurfaceFlinger向HWC提供所有Layer的完整列表,让HWC根据其硬件能力决定如何处理这些Layer。

2)HWC给每个Layer标注合成方式

3)SurfaceFlinger负责先把标注成GPU合成的Layer合成到一个输出buffer,然后把这个输出buffer和其他Layer一起交给HWC,让HWC完成剩余Layer的合成,最后提供给屏幕进行显示

官方要求HWC设备必须具备的功能:

1)至少支持4个叠加层:状态来,系统栏,应用本身和壁纸或者背景

2)叠加层可以大于显示屏

3)具备每像素和每平面的Alpha混合

4)为了支持受保护内容,必须提供受保护内容视频播放的硬件路径

5)RGBA packing order,YUV formats,tiling,swizzling,strict properties

部分专业词汇说明:

  1. Tiling:可以把Image切割成MxN个小块,最后渲染时,再将这些小块拼接起来,就像铺瓷砖一样。
  2. Swizzling:一种拌和技术,表示向量单元可以被任意地重排或重复

HWComposer是Device合成的抽象

Fence:

Fence是一种资源同步机制,可以理解为资源锁。主要用于跨硬件场景,如:CPU,GPU,HWC之间的buffer资源的同步。

实现原理:

Gralloc:

般来讲Gralloc模块在实际设备中是由硬件厂商提供的,以便于最佳地配合手机硬件。实现的目录在hardware/libhardware/modules/gralloc中
Android帧缓冲区硬件抽象层模块Gralloc的实现原理如下:
1)分配一个匹配屏幕大小的图形缓冲区
2)将分配好的图形缓冲区注册(映射)到当前进程的地址空间来
3)将要绘制的画面的内容写入到已经注册好的图形缓冲区中去,并且渲染(拷贝)到系统帧缓冲区中去
为了实现以上三个操作,我们还需要:
1)加载Gralloc模块
2)打开Gralloc模块中的gralloc设备和fb设备
其中,gralloc设备负责分配图形缓冲区,Gralloc模块负责注册图形缓冲区,而fb设备负责渲染图形缓冲区。在GrafficBuffer中,内存是由Gralloc模块中分配的,基于上一节 FB的工作原理,这里主要分析Gralloc模块如何分配内存。

DisplayDevice

应用端的Buffer是向Ashmem申请的;DisplayDevice端的Buffer是向FrameBuffer申请的
应用端的Buffer是用来填充的;DisplayDevice端的Buffer是用来推给Framebuffer 渲染的

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

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

相关文章

(十四)大数据实战——hadoop集群一键式高可用实现自动故障转移与故障初始化恢复

前言 本节内容延续前面几节内容,综合性的实现hadoop集群的高可用以及hadoop集群故障初始化的恢复,通过一个脚本,实现整个集群的高可用启停与状态观测。主要是zookeeper、hdfs、yarn等服务的高可用集群的一键式启停。 正文 hadoop高可用集群整体规划hadoop高可用集群服务规…

什么是公共英语三级?公共英语三级主要考什么

一、公共英语考试介绍 全国英语等级考试(又称公共英语考试)设置五个级别和一个附属级,五个级别是: 一级[含一级(B),即附属级]、二级、三级、四级、五级。 公共英语一级的说明:一级是初始级&…

模拟实现消息队列项目(系列3) -- 服务器模块(硬盘管理)

目录 前言 1. 创建项目 2. 创建核心类 2.1 Exchange 2.2 MSQueue 2.3 Binding 2.4 Message 3. 数据库设计 3.1 SQLite 配置 3.2 Mapper层代码实现 3.2.1 创建表操作 3.2.2 交换机 队列 绑定的增加和删除 3.3 实现DataBaseManager 3.4 DataBaseManager单元测试 4.…

k8s 使用 containerd 运行时配置 http 私服

简介 Kubernetes 从 v1.20 开始弃用 Docker,并推荐用户切换到基于容器运行时接口(CRI)的容器引擎,如 containerd、cri-o 等。 目前使用的环境中使用了 Kubernetes v1.22.3,containerd 1.4.3,containerd 在…

线性代数(三) 线性方程组向量空间

前言 如何利用行列式,矩阵求解线性方程组。 线性方程组的相关概念 用矩阵方程表示 齐次线性方程组:Ax0;非齐次线性方程组:Axb. 可以理解 齐次线性方程组 是特殊的 非齐次线性方程组 如何判断线性方程组的解 其中R(A)表示矩阵A的…

git的简单介绍和使用

git学习 1. 概念git和svn的区别和优势1.1 区别1.2 git优势 2. git的三个状态和三个阶段2.1 三个状态:2.2 三个阶段: 3. 常用的git命令3.1 下面是最常用的命令3.2 git命令操作流程图如下: 4. 分支内容学习4.1 项目远程仓库4.2 项目本地仓库4.3…

恒盛策略:沪指冲高回落跌0.26%,酿酒、汽车等板块走弱,燃气股拉升

10日早盘,两市股指盘中冲高回落,半日成交约4200亿元,北向资金净卖出超20亿元。 到午间收盘,沪指跌0.26%报3235.9点,深成指跌0.54%,创业板指跌0.28%;两市算计成交4202亿元,北向资金净…

【Terraform学习】保护敏感变量(Terraform配置语言学习)

实验步骤 创建 EC2 IAM 角色 导航到IAM 在左侧菜单中,单击角色 。单击创建角色该按钮以创建新的 IAM 角色。 在创建角色部分,为角色选择可信实体类型: AWS 服务 使用案例:EC2 单击下一步 添加权限:现在,您可以看到…

LAMP及论坛搭建

一、概述 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP(或…

小白到运维工程师自学之路 第七十一集 (kubernetes网络设置)

一、概述 Master 节点NotReady 的原因就是因为没有使用任何的网络插件,此时Node 和Master的连接还不正常。目前最流行的Kubernetes 网络插件有Flannel、Calico、Canal、Weave 这里选择使用flannel。 二、安装flannel 1、master下载kube-flannel.yml,所…

《网约车运营数据分析实战》学习笔记

这篇文章整理自 接地气的陈老师 x 和鲸社区 | 网约车运营分析 数据分析实战活动业务讲解会【接地气的陈老师】的讲解, 更多数据分析动手实践活动欢迎访问>>和鲸社区活动页面 活动介绍 假设你是某打车APP的商业数据分析师,为某大区提供日常数据报表…

谈谈Spring与字节码生成技术

Spring框架是一个面向企业级Java应用开发的开源框架,它提供了许多功能和特性来简化Java开发过程。字节码生成技术在Spring框架中起着重要的作用,用于实现依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriente…

Spark中使用RDD算子GroupBy做词频统计的方法

测试文件及环境 测试文件在本地D://tmp/spark.txt,Spark采用Local模式运行,Spark版本3.2.0,Scala版本2.12,集成idea开发环境。 hello world java world java java实验代码 import org.apache.spark.rdd.RDD import org.apache.…

Chrome有些网站打不开,但是火狐可以打开

Chrome有些网站打不开,但是火狐可以打开 问题描述火狐成功界面谷歌报错界面局域网设置使用代理服务器访问成功 解决方案参考 问题描述 开了一个tizi,Chrome不能使用,火狐可以。之前装过插件Ghelper白嫖科学上网,那次之后好像浏览…

领航优配:沪指震荡涨0.47%,保险、券商板块强势,互联金融概念活跃

4日早盘,两市股指高开高走,沪指一度涨逾1%打破3300点,随后涨幅有所收窄;两市半日成交超6000亿元,北向资金小幅净流入。 截至午间收盘,沪指涨0.47%报3295.91点,深成指涨0.67%,创业板指…

【JAVA基础】- 同步非阻塞模式NIO详解

【JAVA基础】- 同步非阻塞模式NIO详解 文章目录 【JAVA基础】- 同步非阻塞模式NIO详解一、概述二、常用概念三、NIO的实现原理四、NIO代码实现客户端实现服务端实现 五、同步非阻塞NIO总结 一、概述 NIO(Non-Blocking IO)是同步非阻塞方式来处理IO数据。…

数据API服务管理功能 - 提升数据效率的关键工具

数据API服务管理功能 - 提升数据效率的关键工具 什么是数据API服务管理功能? 数据API服务管理功能是一种用于有效管理和控制数据API的工具。它为用户提供了方便的界面和功能,以简化数据访问、解析和处理的过程。通过使用数据API服务管理功能&#xff0…

优思学院|质量第一的目的是什么?

国外有一句很著名的话:Quality comes first, profit is its logical sequence,意思是:质量第一,利润是其合理的结果,这句话也是很多公司或者商店使用的标语。 简而言之,只要你把质量放在第一位&#xff0c…

yolo-nas对自定义数据集进行训练,测试详解 香烟数据集

yolov5格式的香烟数据集 https://download.csdn.net/download/qq_42864343/88110620?spm1001.2014.3001.5503 创建yolo-nas的运行环境 进入Pycharm的terminal,输入如下命令 conda create -n yolonas python3.8pip install super-gradients使用自定义数据训练Yo…

苍穹外卖系统07

哈喽!大家好,我是旷世奇才李先生 文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟,回复【项目】获取我为大家准备的项目 最近打算把我手里之前做的项目分享给大家&#…