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系统图像绘制原理大全解

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

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

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

相关文章

深度理解进程的概念(Linux)

目录 一、冯诺依曼体系 二、操作系统(OS) 设计操作系统的目的 核心功能 系统调用 三、进程的概念与基本操作 简介 查看进程 通过系统调用获取进程标识符 通过系统调用创建进程——fork() 四、进程的状态 操作系统中的运行、阻塞和挂起 理解linux内核链表 Linux的进…

系统思考—共同看见

在一家零售企业的项目中,团队频繁讨论客户流失的严重性,但每次讨论的结果都无法明确找出问题的根源。大家都知道客户流失了,但究竟是什么原因导致的,始终没有一致的答案。市场部认为是客户体验差,客服部门觉得是响应慢…

从0开始学PHP面向对象内容之常用设计模式(组合,外观,代理)

二、结构型设计模式 4、组合模式(Composite) 组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示”部分–整体“的层次结构。通过组合模式,客户端可以以一致的方式处理单个对…

Linux 线程互斥

目录 0.前言 1.相关概念 2.互斥量(mutex) 2.1 代码引入 2.2为什么需要互斥量 2.3互斥量的接口 2.3.1 初始化互斥量 2.3.2 销毁互斥量 2.3.3 互斥量加锁和解锁 2.4改写代码 3.互斥量的封装 4.小结 (图像由AI生成) 0.前言 在多线…

前端实用知识-用express搭建本地服务器

目录 一、为什么会有这篇文章? 二、使用前的准备-如环境、工具 三、如何使用?-express常用知识点 四、代码演示-配合截图,简单易懂 一、为什么会有这篇文章? 在日常前端开发中,我们离不开数据,可能是用…

用nextjs开发时遇到的问题

这几天已经基本把node后端的接口全部写完了,在前端开发时考虑时博客视频类型,考虑了ssr,于是选用了nextJs,用的是nextUi,tailwincss,目前碰到两个比较难受的事情。 1.nextUI个别组件无法在服务器段渲染 目前简单的解决方法&…

【数据结构】二叉树(2)

目录 1. 二叉树的遍历 前序遍历 中序遍历 后序遍历 2. 计算二叉树中的节点个数 3. 计算二叉树中叶子节点个数 4. 计算二叉树的深度 5. 计算二叉树第k层节点个数 6. 二叉树基础练习 7. 二叉树的创建 8. 二叉树的销毁 9. 层序遍历 10. 判断二叉树是否为完全二叉树 1…

比特币与区块链原理解析:矿机挖矿与去中心化的未来

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

StarRocks-join优化

1、背景 有两个大表,都是6kw级别上下的,通过SR然后包装了一个接口对外提供查询,当前的问题是,这样大的join查询会导致BE直接宕机。并且这个sql很有代表性,我截图如下: 这个表是个单分区,所以直接…

Qt中2D绘制系统

目录 一、Qt绘制系统 1.1Qt绘制基本概念 1.2 绘制代码举例 1.3画家 1.3.1 QPainter的工作原理: 1.3.2 自定义绘制饼状图: 1.4画笔和画刷 1.4.1画笔 1.4.2 画刷填充样式 1.5 反走样和渐变 1.6绘制设备 1.7坐标变换 1.8QPainterPath 1.9绘制文…

基于.NET调用WebService服务

基于.NET调用WebService服务 上一篇文章用java的Spring Boot框架搭建了一个WebService服务端,这篇文章通过.NET进行调用,下文基于Visual Studio 2022 引入WebService服务 项目右键 -> 添加 -> 服务引用 选择WCF Web Service,点击下一…

IIC 随机写+多次写 可以控制写几次

verilog module icc_tx#(parameter SIZE 2 , //用来控制写多少次 比如地址是0000 一个地址只能存放8bit数据 超出指针就会到下一个地址0001parameter CLK_DIV 50_000_000 ,parameter SPEED 100_000 ,parameter LED 50 )( input wire c…

微信小程序+Vant-自定义选择器组件(多选

实现效果 无筛选,如有需要可参照单选组件中的方法.json文件配置"component": true,columns需要处理成含dictLabel和dictValue字段,我是这样处理的: let list arr.map(r > {return {...r,dictValue: r.xxxId,dictLabel: r.xxx…

基于边缘智能网关的机房安全监测应用

随着我国工业互联网的扎实推进,越来越多地区积极建设信息基础设施,以充沛算力支撑产业物联网的可持续发展,数据机房就是其中的典型代表。而且随着机房规模的扩大,对于机房的安全管理难题挑战也日益增加。 面向数据机房安全监测与管…

HarmonyOS 应用跨团队 Debug 协作

文章目录 前言案例背景与问题分析问题背景问题分析工具 方法与代码实现前端模块的优化:日志记录与网络监听日志记录代码示例代码解析实现逻辑实际应用场景 网络状态监听代码示例代码解析实现逻辑实际应用场景 后端模块的优化:接口性能与容错机制接口性能…

《UnityShader 入门精要》更复杂的光照

代码&示例图见:zaizai77/Shader-Learn: 实现一些书里讲到的shader 到了这里就开启了书里的中级篇,之后会讲解 Unity 中的渲染路径,如何计算光照衰减和阴影,如何使用高级纹理和动画等一系列进阶内容 Unity 中的渲染路径 在U…

Ubuntu20.04安装kalibr

文章目录 环境配置安装wxPython下载编译测试报错1问题描述问题分析问题解决 参考 环境配置 Ubuntu20.04,python3.8.10,boost自带的1.71 sudo apt update sudo apt-get install python3-setuptools python3-rosinstall ipython3 libeigen3-dev libboost…

P1198 [JSOI2008] 最大数

P1198 [JSOI2008] 最大数https://www.luogu.com.cn/problem/P1198 牵制芝士:单调队列 思路: 我们的任务是找出一个区间最大值的 因为插入的数与上一次的答案有关 所以它是强制在线的(真无语了) 我们可以在每次插入时整一个叫…

宠物电商对接美团闪购:实现快速配送与用户增值

随着宠物行业的快速发展,宠物电商市场也在不断扩张。消费者的需求不再局限于传统的线上购物模式,越来越多的人开始追求更快捷的配送服务和更优质的购物体验。为了适应这一趋势,许多宠物电商平台开始寻求与本地配送平台合作,以提供…

阿里云oss转发上线-实现不出网钓鱼

本地实现阿里云oss转发上线,全部代码在文末,代码存在冗余 实战环境 被钓鱼机器不出网只可访问内部网络包含集团oss 实战思路 若将我们的shellcode文件上传到集团oss上仍无法上线,那么就利用oss做中转使用本地转发进行上线,先发送…