当前位置: 首页 > news >正文

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 渲染的

相关文章:

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

目录 引言 概念与理解 SurfaceFlinger Surface HWC Fence: Gralloc: DisplayDevice 引言 Activity是Android的主要UI相关组件。通过View的相关类和接口实现,在WMS的管理下,进行窗口和控件的测量,布局和绘制&am…...

Swift 5 数组如何获取集合的索引和对应的元素值

Swift 5 数组如何获取集合的索引和对应的元素值 在Swift 5中,你可以使用enumerated()方法来获取集合的索引和对应的元素值。这个方法会返回一个包含索引和元素的元组数组。以下是使用enumerated()方法来获取一个数组的索引和元素的示例: let array [1…...

计算 Nginx 日志的PV和UV

计算 Nginx 日志的 PV(页面浏览量)和 UV(独立访客数),你需要使用一些工具和技术。 PV(页面浏览量)是指网站的所有页面被访问的总次数,而 UV(独立访客数)则是指…...

Spring中常用的注解

1.声明Bean的注解(标注在类上) Component:表示普通的组件,也可泛指下面三种组件。Controller:控制层。Service:业务逻辑层。Repository:数据访问层。 2.Bean的生命周期的注解 Scope表示设置Spring是如何创建Bean的…...

Plugin 插件

Plugin 插件 插件是 webpack 的支柱功能。插件目的在于解决 loader 无法实现的其他事。Webpack 提供很多开箱即用的插件。 常用插件 clean-webpack-plugin 自动清理输出目录 html-webpack-plugin 自动生成使用 bundle.js 的 HTML copy-webpack-plugin 拷贝文件到输出目…...

Structure needs cleaning fsimage文件系统损坏修复

最近清除数据的时候发现有些文件无法rm [rootnode101 application_1691504014432_0002]# rm -rf ls:* [rootnode101 application_1691504014432_0002]# ls ls: 无法访问flink-dist-cache-8f72398e-9254-42d4-a14d-a0def99b493d: Structure needs cleaning以下操作可能会删除文件…...

MATLAB|信号处理的Simulink搭建与研究

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

LinuxC编程——线程

目录 一、概念二、进程与线程的区别⭐⭐⭐三、线程资源四、函数接口4.1 线程创建4.2 线程退出4.3 线程回收4.3.1 阻塞回收4.3.2 非阻塞回收 4.4 pthread_create之传参4.5 练习 一、概念 是一个轻量级的进程,为了提高系统的性能引入线程。 进程与线程都参与cpu的统一…...

使用fetch调用fastapi接口(post)的实例

前端代码 //定义函数 async function sendRequest(data) {let myurl"http://127.0.0.1:8848/get_student_info"const response await fetch(myurl, {method: POST,mode: cors, // 执行跨域请求headers: {Content-Type: application/json, },body: JSON.st…...

探索规律:Python地图数据可视化艺术

文章目录 一 基础地图使用二 国内疫情可视化图表2.1 实现步骤2.2 完整代码2.3 运行结果 一 基础地图使用 使用 Pyecharts 构建地图可视化也是很简单的。Pyecharts 支持多种地图类型,包括普通地图、热力图、散点地图等。以下是一个构建简单地图的示例,以…...

Django-------自定义命令

每次在启动Django服务之前,我们都会在终端运行python manage.py xxx的管理命令。其实我们还可以自定义管理命令,这对于执行独立的脚本或任务非常有用,比如清除缓存、导出用户邮件清单或发送邮件等等。 自定义的管理命令不仅可以通过manage.p…...

【Linux】在浏览器输入网址后发生了什么事情?

在浏览器输入网址后发生了什么事情? 1.域名解析2.建立TCP连接3.发出HTTP请求4.响应请求5.TCP断开连接6.解析资源和布局渲染 其实我们在浏览器输入网址后,发生了如下的事情 1.域名解析 由于计算机是无法识别我们输入的地址的,那么就需要将当前…...

推荐两本书《JavaRoadmap》、《JustCC》

《JavaRoadmap》 前言 本书的受众 如果你是一名有开发经验的程序员,对 Java 语言语法也有所了解,但是却一直觉得自己没有入门,那么希望这本书能帮你打通 Java 语言的任督二脉。 本书的定位 它不是一本大而全的书,而是一本打通、…...

使用基于jvm-sandbox的对三层嵌套类型的改造

使用基于jvm-sandbox的对三层嵌套类型的改造 问题背景 先简单介绍下基于jvm-sandbox的imock工具,是Java方法级别的mock,操作就是监听指定方法,返回指定的mock内容。 jvm-sandbox 利用字节码操作和自定义类加载器的技术,将原始方法…...

[HDLBits] Mt2015 q4b

Circuit B can be described by the following simulation waveform: Implement this circuit. module top_module ( input x, input y, output z );//001 100 010 111assign z(xy); endmodule...

C++:堆排序

堆排序 输入一个长度为n的整数数列,从小到大输出前m小的数 输入格式 第一行包含整数n和m 第二行包含n个整数,表示整数数列 输出格式 共一行,包含m个整数,表示整数数列中前m小的数 数据范围 1 ≤ m ≤ n ≤ 1 0 5 1\le m\le …...

Grafana Prometheus 通过JMX监控kafka

第三方kafka exporter方案 目前网上关于使用Prometheus 监控kafka的大部分资料都是使用一个第三方的 kafka exporter,他的原理大概就是启动一个kafka客户端,获取kafka服务器的信息,然后提供一些metric接口供Prometheus使用,随意它…...

vue项目切换页面白屏不显示解决方案

问题描述 1、页面切换后白屏&#xff0c;同时切换回上一个页面同样白屏 2、刷新后正常显示 3、有警告&#xff1a;Component inside <Transition> renders non-element root node that cannot be animated 解决方法 <Transition>中的组件呈现不能动画化的非元素…...

Goland报错 : Try to open it externally to fix format problem

这句报错的意思也就是 : 尝试在外部打开以解决格式问题 解决方案 : 将图片格式该为.png格式&#xff0c;再粘贴进去就可以了! 改变之后的效果 : 那么&#xff0c;这样就ok了...

Python-OpenCV中的图像处理-几何变换

Python-OpenCV中的图像处理-几何变换 几何变换图像缩放图像平移图像旋转仿射变换透视变换 几何变换 对图像进行各种几个变换&#xff0c;例如移动&#xff0c;旋转&#xff0c;仿射变换等。 图像缩放 cv2.resize() cv2.INTER_AREAv2.INTER_CUBICv2.INTER_LINEAR res cv2.r…...

如何高效管理全面战争MOD:虎符台/Legion Seal完整指南

如何高效管理全面战争MOD&#xff1a;虎符台/Legion Seal完整指南 【免费下载链接】legion-seal 虎符台/Legion Seal&#xff0c;全面战争游戏MOD管理器&#xff0c;技术栈&#xff1a;Tauri 2 Vue TailwindCSS 项目地址: https://gitcode.com/zeyl/legion-seal 前言&…...

Phi-3-mini-128k-instruct效果对比:vs Phi-3-4K在长文本摘要任务中的质量差异

Phi-3-mini-128k-instruct效果对比&#xff1a;vs Phi-3-4K在长文本摘要任务中的质量差异 1. 模型简介与背景 Phi-3-Mini-128K-Instruct是一个38亿参数的轻量级开放模型&#xff0c;属于Phi-3系列的最新成员。该模型使用专门设计的Phi-3数据集进行训练&#xff0c;该数据集包…...

1980-2025年中国各区县逆温数据

1980&#xff5e;2025 年中国各区县逆温数据 该数据包含如下变量&#xff0c;各个变量的含义如下&#xff1a; date&#xff1a;日期 year&#xff1a;年 mnth&#xff1a;月 day&#xff1a;日 省&#xff1a;省份名称 省代码&#xff1a;省份行政区划代码 市&#xf…...

低代码表单卡顿、重复提交、校验失效?这7个PHP-FPM+AJAX协同配置项必须今天就检查!

第一章&#xff1a;低代码表单性能瓶颈的根源诊断低代码表单在快速交付场景中广受青睐&#xff0c;但其运行时性能常随字段数量、校验逻辑与数据联动复杂度呈非线性下降。性能瓶颈并非孤立存在于某一层级&#xff0c;而是前端渲染、事件响应、后端数据绑定与元数据解析四者耦合…...

5分钟快速上手labelCloud:轻量级3D点云标注工具的完整指南

5分钟快速上手labelCloud&#xff1a;轻量级3D点云标注工具的完整指南 【免费下载链接】labelCloud A lightweight tool for labeling 3D bounding boxes in point clouds. 项目地址: https://gitcode.com/gh_mirrors/la/labelCloud 你是否正在寻找一款简单易用、功能强…...

LightOnOCR-2-1B GPU算力方案:单卡A10部署 vs 双卡T4分片部署成本效益对比

LightOnOCR-2-1B GPU算力方案&#xff1a;单卡A10部署 vs 双卡T4分片部署成本效益对比 1. 项目背景与需求分析 LightOnOCR-2-1B 是一个拥有10亿参数的多语言OCR识别模型&#xff0c;支持包括中文、英文、日文、法文、德文、西班牙文、意大利文、荷兰文、葡萄牙文、瑞典文和丹…...

5个AI Skill实测:影视内容创作全流程自动化

为什么AI助手的能力上限取决于你装了什么Skill养虾必装的5个Skill&#xff0c;影视博主效率翻倍你的小龙虾&#xff08;OpenClaw/CodeBuddy/Windsurf&#xff09;装了几个Skill&#xff1f;很多人养虾只用来写代码、查资料&#xff0c;但其实用小龙虾做内容创作、数据分析、批量…...

ChatTTS语音导航优化:车载系统更人性化播报

ChatTTS语音导航优化&#xff1a;车载系统更人性化播报 1. 引言&#xff1a;让车载导航真正"会说话" 你有没有遇到过这样的情况&#xff1a;开车时听着机械冰冷的导航语音&#xff0c;感觉像是在听机器人念经&#xff1f;"前方300米右转"、"请保持直…...

OpenClaw调用Qwen3-32B镜像成本实测:RTX4090D长任务Token消耗分析

OpenClaw调用Qwen3-32B镜像成本实测&#xff1a;RTX4090D长任务Token消耗分析 1. 为什么关注OpenClaw的Token消耗问题 第一次用OpenClaw完成文件整理任务时&#xff0c;我被账单吓了一跳——短短10分钟的操作消耗了近3万Token。这让我意识到&#xff1a;自动化助手的长期使用…...

Java JDK1.9快速下载与安装指南

1. Java JDK1.9简介与下载准备 Java Development Kit&#xff08;JDK&#xff09;是Java开发的核心工具包&#xff0c;而JDK1.9作为早期版本&#xff0c;虽然现在已经不是主流选择&#xff0c;但在某些特定场景下仍然有开发者需要使用。如果你正在寻找JDK1.9的下载和安装方法&a…...