Android图形系统之SurfaceFlinger/OpenGL/HWC/Gralloc/FrameBufer/ION/GPU等关系(十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解SurfaceFlinger/OpenGL/HWC/Gralloc/FrameBufer/ION关系

在这里插入图片描述

2.HWC

HWC(hwcomposer)是Android中进行窗口(Layer)合成和显示的HAL层模块,特定的硬件设备,而且通常由显示设备制造商 (OEM)完成,为SurfaceFlinger服务提供硬件支持。

HWC合成机制
1.SurfaceFlinger给HWC提供layer list,询问如何处理这些layer;
2.HWC将每个layer标记为overlay或者GLES composition,然后回馈给SurfaceFlinger;
3.SurfaceFlinger需要去处理那些GLES的合成,而不用去管overlay的合成,最后将overlay的layer和GLES合成后的buffer发送给HWC处理。

在这里插入图片描述

在这里插入图片描述

SurfaceFlinger可以使用OpenGL ES合成Layer,这需要占用并消耗GPU资源。
大多数GPU都没有针对图层合成进行优化,当SurfaceFlinger通过GPU合成图层时,应用程序无法使用GPU进行自己的渲染。
而HWC通过硬件设备进行图层合成,可以减轻GPU的合成压力。

3.GPU

区别于HWC硬件,当没有GPU的设备,可以使用HWC或CPU渲染。

4.OpenGL ES

OpenGL ES是一套绘制3D图形的API,OpenGL ES是和平台无关的一套API ,主要是为了rendering 2D 和 3D图形等。一般这套接口是用来和GPU进行交互的,使用GPU进行rendering 硬件加速。 说白了OpenGL就是一组函数名,并不能直接用,需要底层硬件GPU的支持。
OpenGL ES的实现方式有2种:
第一种:是软件实现,用cpu去绘图,就是的agl(libGLES_android.so), 路径frameworks\native\opengl\libagl,即the software OpenGL ES library.
第二种:是硬件厂商根据自己GPU提供的实现,一般都不开放源代码,就是/vendor/lib/egl或/system/lib/egl目录下的库。

5.EGL

EGL库的作用就是将OpenGL ES和本地窗口系统结合起来。
如果要画个纹理三角形,调用OpenGL ES接口,如果要把图形渲染(显示)到屏幕,需要调用EGL接口。
使用OpenGL ES前,先需要调用EGL的相关函数设置好OpenGL ES的本地环境,一般EGL和OpenGL ES使用时都会先利用egl函数(egl开头)创建opengl本地环境,然后再利用opengl函数(gl开头)去画图!

6.NativeWindow和OpenGL调用关系

在这里插入图片描述

7.Surface

本地窗口为Surface,继承自ANativeWindow。
在这里插入图片描述

8.Gralloc核心功能作为framebuffer的封转,向/dev/fb0写数据,显示在屏幕上。

gralloc分配framebuffer图形缓冲区
gralloc分配图形缓冲区,又分为framebuffer图形缓冲区(GPU操作:/dev/graphics/fb)和普通图形缓冲区(CPU操作:/dev/fb)两种。
gralloc调用gralloc_alloc_framebuffer()分配framebuffer的内存,
其核心是对fb设备/dev/graphics/fb或者/dev/fb执行mmap(),映射到用户空间,然后去操作。这样用户空间就可以共享数据给GPU显存和CPU的内存了,就可以直接操作。

android中,HAL层的gralloc库负责了申请图形缓冲区的所有工作,HAL层之上的Surface、BufferQueue最终都是调用gralloc库去申请图形缓冲区。

9.Vsync 垂直同步信号

HWC利用硬件或者软件产生的持续Vsync信号,去触发SurfaceFlinger和UI去做绘图相关的工作,让绘图工作充分利用每个Vsync信号间隔的时间;
Triple Buffering,SurfaceFlinger有三缓冲会将Jank几率降到最小。

在这里插入图片描述
在这里插入图片描述

10.Fence

Fence是一个同步机制,它是OpenGL ES 3.0的一个特性,在GPU和CPU之间协调工作,fence让GPU和CPU并行运行,提高了图像显示的速度。
CPU和GPU两个硬件是异步的,当使用opengl时,首先在CPU上调用一系列gl命令,然后这些命令去GPU执行真正的绘图过程,绘图何时结束,CPU根本不知道,当然可以让CPU阻塞等待GPU绘图完成,然后再去处理后续工作,但是这样效率就太低。于是Fence机制便产生了。

11.显示相关

DisplayManager:管理附加显示器的属性。
LogicalDisplay:描述如何配置逻辑显示。
DisplayInfo:描述特定逻辑显示的特性。
DisplayAdapter:显示适配器使系统可以使用零个或多个显示设备,并提供发现何时连接或断开显示的工具。目前,所有显示适配器都在系统服务器中注册,但原则上可以从其他进程中完成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】多态案例— —计算器类

author:&Calton tag:C topic:【C】多态案例— —计算器类 website:黑马程序员C date:2023年7月23日 目录 多态概要 案例实现 原理剖析 多态概要 多态是C三大特性之一(封装、继承、多态&#xff…

【SpringBoot项目】Tomcat started on port(s): 8080 (http) with context path ‘‘

运行程序后出现下面的错误,并且在postman中无法获取到数据 在idea中的错误显示的如下 本人的原因是忘记在Controller中忘记写!!!! RestController 如果你不是以下原因可以参考下面的文章: Initializing S…

在VSCode中实现Rust编程调试指南

在 VS Code 中调试 Rust:终极指南 在本教程中,您将学习如何使用 VS Code 调试 Rust。可用于使用 VS Code 调试 Rust 的操作。设置 VS Code 来调试 Rust Rust因其易用性、安全性和高性能而继续保持其作为最受欢迎的编程语言的地位。随着 Rust 的流行&…

MySQL 的 crash-safe浅谈

MySql执行流程 MySQL作为当下最流行的开源关系型数据库,有一个很关键和基本的能力,就是必须能够保证数据不会丢。那么在这个能力背后,MySQL是如何设计才能保证不管在什么时间崩溃,恢复后都能保证数据不会丢呢?有哪些…

【期末课程设计】学生成绩管理系统

因其独特,因其始终如一 文章目录 一、学生成绩管理系统介绍 二、学生成绩管理系统设计思路 三、源代码 1. test.c 2. Student Management System.c 3.Stu_System.c 4.Teacher.c 5.Student Management System.h 前言: 学生成绩管理系统含教师…

基于PySceneDetect的视频场景变换侦测与处理

剪映中集成了一个智能镜头分割的功能,其实是基于python的三方库PySceneDetect来实现的,主要用于对视频进行分析,寻找场景切换或剪辑。 不过一个一个处理起来比较麻烦,这里介绍一个python的三方库实现自动化批量处理。 文章目录 PySceneDetect主要功能特征PySceneDetect的安…

[golang gin框架] 40.Gin商城项目-微服务实战之Captcha验证码微服务

本次内容需要 gin框架基础知识, golang微服务基础知识才能更好理解 一.Captcha验证码功能引入 在前面,讲解了微服务的架构等,这里,来讲解前面商城项目的 Captcha验证码 微服务 ,captcha验证码功能在前台,后端 都要用到 ,可以把它 抽离出来 ,做成微服务功能 编辑 这个验证码功能…

windows下搭建php开发环境

http://wed.xjx100.cn/news/139397.html?actiononClick https://www.bilibili.com/read/cv23429835/ https://www.php.cn/faq/498307.html 安装iis 选择卸载程序 安装php 官网https://www.php.net/下载 选择线程安全 国内地址 下载完成后解压放到想存放的路径 添加p…

基于SaaS模式的Java基层卫生健康云HIS系统源码【运维管理+运营管理+综合监管】

云HIS综合管理平台 一、模板管理 模板分为两种:病历模板和报表模板。模板管理是运营管理的核心组成部分,是基层卫生健康云中各医疗机构定制电子病历和报表的地方,各医疗机构可根据自身特点特色定制电子病历和报表,制作的电子病历…

VUE3 语法教程

vue3 起步 刚开始学习 Vue,我们不推荐使用 vue-cli 命令行工具来创建项目,更简单的方式是直接在页面引入 vue.global.js 文件来测试学习。 Vue3 中的应用是通过使用 createApp 函数来创建的,语法格式如下: const app Vue.crea…

【LeetCode每日一题合集】2023.7.17-2023.7.23(离线算法 环形子数组的最大和 接雨水)

文章目录 415. 字符串相加(高精度计算、大数运算)1851. 包含每个查询的最小区间⭐⭐⭐⭐⭐解法1——按区间长度排序 离线询问 并查集解法2——离线算法 优先队列 874. 模拟行走机器人(哈希表 方向数组)918. 环形子数组的最大和…

ts中setState的类型

两种方法: 例子: 父组件 const [value, setValue] useState(); <ChildsetValue{setValue} />子组件 interface Ipros {setValue: (value: string) > void } const Child: React.FC<Ipros> (props) > {}

(css)清除el-table背景色

(css)清除el-table背景色 效果&#xff1a; <el-table:data"gridData":header-cell-style"{text-align:center,color: #fff}":cell-style"{text-align:center,color: #fff }" ><el-table-column type"index" label"序号…

Linux QT通过NFS挂载到Linux开发板上

Linux QT通过NFS挂载到Linux开发板上 说明&#xff1a;这里使用的Linux开发板是正点原子的阿尔法开发板 创建NFS 环境 NFS简介 网络文件系统&#xff0c;英文 Network File System(NFS)&#xff0c;是由 SUN 公司研制的 UNIX 表示层协议 (presentation layer protocol)&…

Spring Security 构建基于 JWT 的登录认证

一言以蔽之&#xff0c;JWT 可以携带非敏感信息&#xff0c;并具有不可篡改性。可以通过验证是否被篡改&#xff0c;以及读取信息内容&#xff0c;完成网络认证的三个问题&#xff1a;“你是谁”、“你有哪些权限”、“是不是冒充的”。 为了安全&#xff0c;使用它需要采用 …

【JavaEE】Spring中注解的方式去存储Bean对象

Spring的开发要点总结 文章目录 【JavaEE】Spring的开发要点总结&#xff08;2&#xff09;1. 通过类注解的方式存储Bean对象1.1 五大 类注解1.1.1 Controller 控制器存储1.1.2 Service 服务存储1.1.3 Repository 仓库存储1.1.4 Component 组件存储1.1.5 Configuration 配置存储…

iview的表格添加筛选功能需要注意的问题

给table的某列添加筛选功能 在table中通过给columns数据的项&#xff0c;设置 filters&#xff0c;可进行筛选&#xff0c;filters 接收一个数组。 然后再指定一个筛选函数 filterMethod 才可以进行筛选&#xff0c;filterMethod 传入两个参数value和 row。 如果指定 filter…

Ubuntu linux安装搜狗输入法

效果图&#xff1a; 一、首先要卸载掉自带的输入法 1、以root 身份登录系统并打开终端输入&#xff1a; apt-get remove ibus-pinyin 2、如果卸载后还需要使用&#xff0c;可通过如下方法安装 以root 身份登录系统并打开终端输入&#xff1a; apt-get install ibus-pinyin …

Matlab的GUI设计

文章目录 AppDesigner各个版本的特点mlapp文件基本格式AppDesigner的回调函数常见控件的属性MVC模式MVC模式设计GUIMVC简单使用 其他让app designer置顶将Guide的GUI导出为m文件将app编译为exe将app中的多个控件组合在一起 AppDesigner 20200328 各个版本的特点 在2017b版本中…

^(按位异或)操作符详解

因为未知&#xff0c;所以全力以赴 目录 例1.实现两个数的交换 例2.找出单身狗 1.简单版 2.进阶版 大家好&#xff0c;我是纪宁。这篇博客介绍^操作符及使用案例。 位操作符是对操作数的二进制补码进行操作。^就是位操作符的一种&#xff0c;叫按位异或操作符。计算结果是…