Android 图形系统之一:概览

Android 图形系统是一套完整的架构,用于管理从应用绘制到显示屏幕的整个流程。它涉及多个层次和组件,从应用程序到硬件,确保每一帧都能准确、高效地呈现到用户的设备屏幕上。

1. Android 图形系统的架构

Android 图形系统的架构可以分为以下几层:

1.1 应用层

  • 主要功能:负责生成绘制内容(UI)。
  • 核心组件View 和 ViewGroup:应用 UI 的基础构件。Canvas:绘制 2D 图形的接口。SurfaceView/TextureView:支持自定义绘制和高性能显示。

1.2 框架层

  • 主要功能:桥接应用层和底层图形系统。
  • 核心组件ViewRootImpl:管理 View 的绘制、布局以及输入事件的分发。SurfaceControl:控制 Surface(窗口或图层)的创建、属性设置等。Choreographer:协调绘制和显示的同步,处理 VSync 信号。

1.3 原生层

  • 主要功能:管理图形缓冲区和帧合成。
  • 核心组件SurfaceFlinger:Android 的窗口合成器,负责将多个应用的窗口内容合成到屏幕。BufferQueue:生产者和消费者模型,负责在应用和 SurfaceFlinger 之间传递帧。Gralloc:图形内存分配器,为图形缓冲区分配共享内存。

1.4 硬件抽象层 (HAL)

  • 主要功能:为系统提供统一的硬件接口。
  • 核心组件Hardware Composer (HWC):负责与显示硬件交互,优化图层合成(如直接使用硬件 Overlays)。OpenGL ES/Vulkan:提供 GPU 加速的渲染接口。

在这里插入图片描述
图片源于Linux Graphic Stack相關的名詞

1.5 硬件层

  • 主要功能:包括 GPU 和显示控制器。
  • 核心组件GPU:负责执行 OpenGL ES 或 Vulkan 命令,处理复杂图形计算。
  • 显示控制器:直接控制显示设备,如屏幕刷新。

2. 图形系统的关键流程

2.1 渲染和绘制流程

以下是从应用代码到屏幕内容呈现的完整流程:

  1. 应用绘制
  • 应用通过 View 或 Canvas 发起绘制。
  • 绘制内容被写入 Surface(帧缓冲区)。
  1. 帧提交
  • 应用通过 Surface 提交绘制的帧,写入 BufferQueue 的生产端。
  1. SurfaceFlinger 合成
  • 从 BufferQueue 的消费端获取缓冲区。
  • 通过 GPU 或 HWC 合成所有窗口的图层。
  • 最终合成的帧被提交给显示设备。
  1. 屏幕显示
  • 显示控制器接收最终帧,并根据 VSync 刷新显示屏幕。

2.2 VSync 信号和帧同步

  • VSync 信号:由显示控制器产生,用于驱动屏幕刷新。
  • 帧同步流程:VSync 信号触发 Choreographer。应用通过 doFrame 回调完成 UI 渲染。SurfaceFlinger 在下一次 VSync 周期前完成合成。

3. Android 图形系统的核心组件

3.1 SurfaceFlinger

  • 职责:管理窗口的图层合成和屏幕内容显示。
  • 工作方式:使用 GPU 或 HWC 完成图层的合成。确保屏幕内容按正确顺序和属性(透明度、旋转等)呈现。

3.2 Hardware Composer (HWC)

  • 职责:直接与显示硬件交互,优化合成。
  • 功能:将部分图层直接传递给硬件 Overlay,避免 GPU 合成。

3.3 BufferQueue

  • 职责:在应用和 SurfaceFlinger 之间传递缓冲区。
  • 模型生产者:应用写入图像帧。消费者:SurfaceFlinger 获取并合成图像帧。

4. Android 图形性能调优

4.1 性能指标

  • FPS(帧率):反映屏幕的流畅度。
  • Frame Time(帧时间):每帧所需时间,理想值为 16.67ms(60Hz 屏幕)。
  • Jank(卡顿):掉帧导致的用户体验不佳。

4.2 性能瓶颈

  • CPU 过载:应用逻辑过于复杂。
  • GPU 瓶颈:复杂绘制导致 GPU 渲染延迟。
  • 缓冲区问题:BufferQueue 过满或过慢导致帧延迟。

4.3 调试工具

  1. Systrace
  • 分析应用和系统的图形性能。
  • 定位掉帧和绘制延迟问题。
  1. GPU Profiler
  • 查看 GPU 的性能使用情况。
  • 分析渲染效率。
  1. Perfetto
  • 深入分析系统级性能,包括 SurfaceFlinger 和 HWC 的行为。

5. 图形系统的未来趋势

  1. 高刷新率支持:适配 120Hz 或更高刷新率设备。
  2. Vulkan 加速:更多应用使用 Vulkan 进行高性能渲染。
  3. 多窗口和多显示支持:优化多任务和外接显示器的用户体验。
  4. 节能优化:利用硬件 Overlay 和 Display Panel 自适应刷新率降低功耗。

图示:Android 图形架构

在这里插入图片描述

图片源于Android进阶宝典 – Android系统图像绘制原理大全解

如果对某一模块感兴趣,可以进一步深入讲解实现细节或调试方法!

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

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

相关文章

【C语言】指针与数组的例题详解:深入分析与高级用法

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯题目一详细分析与解答代码逐步解析 💯进一步优化和拓展1. 指针与数组的关系2. 指针运算的注意事项3. 常见的错误和陷阱4. 拓展:指针操作的应用场…

Windows修复SSL/TLS协议信息泄露漏洞(CVE-2016-2183)

打开服务器,运行gpedit.msc,打开“本地组策略编辑器”,依次打开计算机配置-管理模板-网络-SSL配置设置。 打开“SSL密码套件顺序”,更改为已启用,并修改套件算法,去掉TLS1.1版本算法。 TLS_ECDHE_ECDSA_WIT…

go-zero(八) 中间件的使用

go-zero 中间件 一、中间件介绍 中间件(Middleware)是一个在请求和响应处理之间插入的程序或者函数,它可以用来处理、修改或者监控 HTTP 请求和响应的各个方面。 1.中间件的核心概念 请求拦截:中间件能够在请求到达目标处理器之…

vscode ctrl+/注释不了css

方式一.全部禁用插件排查问题. 方式二.打开首选项的json文件,注释掉setting.json,排查是哪一行配置有问题. 我的最终问题:需要将 "*.vue": "vue",改成"*.vue": "html", "files.associations": { // "*.vue": &qu…

使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块

作者:来自 Elastic Gustavo Llermaly 在 Elasticsearch 中使用 Jina Embeddings v2 模型并探索长上下文嵌入模型的优缺点。 在本文中,我们将配置和使用 jina-embeddings-v2,这是第一个开源 8K 上下文长度嵌入模型,首先使用 semant…

电视网络机顶盒恢复出厂超级密码大全汇总

部分电视机顶盒在按遥控器设置键打开设置时,会弹出设置密码弹窗,需输入密码才能操作其中内容。 如下图所示: 部分电视机顶盒在选择恢复出厂设置时,会出现设置密码弹窗,只有输入操作密码后才能进行恢复出厂设置的操作。…

cmake原理

CMake原理与快速入门 CMake是一个跨平台的构建(build)工具,完成代码编译、链接、打包过程。在开发AI应用平台时,由于开发的平台是在边缘设备运行的,而边缘设备的算力不高,所以对平台的效率要求比较高&…

SFTP全解析:深入了解组件功能与适用场景

文章目录 一、组件功能二、适用场景三、SFTP优势四、SFTP原理五.SFTP与同类产品对比六、部署方案1.裸金属部署2.k8s容器化部署 七、高可用方案八、监控方案九、常见问题及解决方法 一、组件功能 安全文件传输协议SFTP(SSH File Transfer Protocol)是文件传输协议(F…

java——Spring MVC的工作流程

Spring MVC的工作流程是基于模型-视图-控制器(MVC)设计模式的一个典型实现,以下是其主要工作流程步骤: 客户端请求提交: 用户通过浏览器向服务器发送请求,该请求首先到达Spring MVC的前端控制器DispatcherS…

Mutex::Autolock 和 std::lock_guard 的区别

Mutex::Autolock 和 std::lock_guard 都是 C 中用于管理互斥锁(mutex)的一种方式,它们的目标是自动获取和释放锁,避免手动管理锁的复杂性,从而防止死锁和遗漏解锁等问题。尽管它们有相似的功能,但二者也存在…

<项目代码>YOLOv8 红绿灯识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

mac下安装Ollama + Open WebUI + Llama3.1

本文介绍mac下安装Ollama Open WebUI Llama3.1 8b具体步骤。 目录 推荐配置Ollama Open WebUI Llama3.1简介安装Ollama安装Open WebUI 推荐配置 m1以上芯片,16g内存,20g以上硬盘空间 Ollama Open WebUI Llama3.1简介 Ollama: 下载,管理…

Linux 无图形界面磁盘空间排查与优化实践20241127

Linux 无图形界面磁盘空间排查与优化实践 引言:磁盘空间问题的痛点与挑战 🔍 常见问题 当系统磁盘空间超过 90% 时,不仅可能导致性能下降,还可能让关键操作无法正常完成。这种情况下,如何高效且精准地排查磁盘占用来…

【AI】JetsonNano启动时报错:soctherm OC ALARM

1、问题描述 将JetsonNano烧写SD卡镜像为Ubuntu20.04后,启动时报错:soctherm OC ALARM,启动失败;然后系统一直重启 2、原因分析 “soctherm OC ALARM”是检测到系统温度超过安全阈值时发出的过热警告。 “soctherm”代表系统…

SycoTec 4060 ER-S德国高精密主轴电机如何支持模具的自动化加工?

SycoTec 4060 ER-S高速电主轴在模具自动化加工中的支持体现在以下几个关键方面: 1.高精度与稳定性:SycoTec 4060 ER-S锥面跳动小于1微米,确保了加工过程中的极高精度,这对于模具的复杂几何形状和严格公差要求至关重要。高精度加工…

d3-contour 生成等高线图

D3.js 是一个强大的 JavaScript 库,用于创建动态、交互式数据可视化。d3-contour 是 D3.js 的一个扩展模块,用于生成等高线图(contour plots)。 属性和方法 属性 x: 一个函数,用于从数据点中提取 x 坐标。y: 一个函…

Docker 部署 MongoDB

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: GitCode💫 Gitee &#x1f…

鸿蒙MVVM模式介绍与使用

文章目录 鸿蒙MVVM模式介绍与使用背景MVVM模式介绍相关装饰器介绍State状态变量Prop、Link的作用 MVVM架构模式的实现以及相关装饰器的使用具体实现效果 总结 鸿蒙MVVM模式介绍与使用 背景 最近在学习鸿蒙开发,想到了以前写安卓移动端应用时经常会用到的MVVM架构模式,就想着能…

解决SpringBoot连接Websocket报:请求路径 404 No static resource websocket.

问题发现 最近在工作中用到了WebSocket进行前后端的消息通信,后端代码编写完后,测试一下是否连接成功,发现报No static resource websocket.,看这个错貌似将接口变成了静态资源来访问了,第一时间觉得是端点没有注册成…

【RISC-V CPU 专栏 -- 香山处理器介绍】

文章目录 RISC-V 香山处理器介绍雁栖湖处理器南湖处理器RISC-V 香山处理器介绍 相信很多小伙伴对于“香山”都不陌生,它是一款开源RISC-V处理器核,香山的每一代架构,都是采用了湖的名字,第一代架构被命名为雁栖湖,第二代架构则叫做 “南湖”。 “雁栖湖”这款处理器的 R…