Android显示系统(01)- 架构分析

一、前言:

Android是基于Linux的,而显示设备的驱动也都是和Linux普通设备一样去管理,也就是说归根结底还是要按照Linux的方式组织数据送给LCD,因此,我们理解Android设计的这一套复杂的显示系统时候,一定要提醒自己目的地在哪儿!

二、显示系统逻辑:

这儿先画个很简单的逻辑图,帮助大家理解:

在这里插入图片描述

  • APP不断生产数据到内存的FrameBuffer中,CPU控制FrameBuffer中的数据定期送给LCD即可;
  • LCD上的一个像素在FrameBuffer中用两个字节描述,比如LCD要显示1920*1080大小图片,那么FrameBuffer分配的大小就应该是1920*1080*2字节;

大家不妨思考两分钟,这个系统最大的问题在哪儿?

…Two minutes later…

最大问题就是只有一个FrameBuffer,朋友请你想一想,APP和LCD同时在访问同一个FrameBuffer,这不就相当于你当着用户的面明目张胆地画图吗?用户火气大一点,你设备都得被摔稀碎。这样就会导致:

  • 如果你APP写得快,LCD读的慢,这样就有可能会跳帧,比如:原来的画面是123,APP写完1之后LCD显示了,当APP写完2的时候LCD还没来读,APP写完3的时候LCD又来读了,因此,LCD显示出来的是13;
  • 如果APP写得太慢,LCD读的太快,同理,就是卡帧,因此你太慢了;
  • 如果APP写得刚好等于LCD读的速度,那么不会有问题,可实际场景中,这种理想化场景几乎不可能一直保持;

那么,怎么改进呢?

就是采用多个FrameBuffer,如下图所示:

在这里插入图片描述

  • 当APP写FrameBuffer1的时候,LCD在读取FrameBuffer2

  • 完成之后,会将FrameBuffer1FrameBuffer2进行swap(交换);

  • 然后App写FrameBuffer2,LCD读FrameBuffer1

一直这样循环即可大功告成!!!

二、Layer:

想象下,如果每个APP都跑去绘图会有什么问题?比如你在小窗口刷视频网站,此时,最顶端的状态栏,最下端的导航栏,以及视频播放窗口这三个都不停去送显,但是状态栏和导航栏几乎是不变的,只有APP的自己视频窗口内容一直在变,他们三个都送显会浪费系统资源。因此,引入Layer(图层)的概念,比如我们可以将状态栏和导航栏打包成一个Layer,让SystemUI进程去负责刷新,APP单独一个Layer去刷新数据,这样,每个Layer在底层都有自己的FrameBuffer,上层只管往里写,最终通过SurfaceFlinger控制HWC去合成为一张图片送显。

三、APP到SurfaceFlinger:

上面了解了一个很潦草的框架图,下面就详细分析下数据怎么准备的,又是最终怎么送给FrameBuffer的。

整个显示系统可以用一个很关键的模块串起来,那就是大名鼎鼎的SurfaceFlinger(下文可能会因为懒,写成SF),它的主要作用就是对多个App的,我们先看一个架构图:
在这里插入图片描述

这个图我的重点是在App给SurfaceFlinger送的数据是如何准备的:

  • 每个APP都有1到多个buffer,这个buffer是从SF申请来的,SF传给APP的是fd,APP进行mmap即可获得对应buffer;
  • APP拿到buffer之后,可以直接往buffer写数据,可以通过2D引擎库(比如skia)或者3D引擎库(OpenGL ES)去准备数据(就是渲染);
  • 准备好数据之后写入到Surface当中(其实上面说的buffer由surface在管理);
  • 这样,每个APP都写好了自己的Surface,Android会将这多个Surface通过Z-Order(前后顺序)结合Layout(布局)进行合成为一张图片;
  • 当然SF并不是啥都自己干,它可以通过Gralloc去管理内存,可以通过HWC去合成Surface,也可以调用OpenGL ES去合成;

四、SurfaceFlinger:

SurfaceFlinger作为Android显示系统的核心管理者,涉及的模块特别多,我们先理清楚几个关键模块之间的关系,否则,会只见树木不见森林。

在这里插入图片描述

  • 主要模块:

    • SurfaceFlinger:将Surface合成起来,管理着两个驱动程序ashmem和frameBuffer;

    • Ashmem:匿名内存模块;

    • Gralloc:负责帧buffer的分配和释放;

    • EGL:为了保证OpenGL ES的平台无关性,封装EGL;

    • OpenGL ES:OpenGL不是一个库,是一种接口协议,如果有gpu会加载gpu对应的libhgl库,如果没有gpu,也可以加载libagl这个纯软件库,通过cpu去完成,具体应该加载软件还是硬件库,会在egl.cfg这个配置文件中配置好;

    • FramebufferNaitveWindow:OpenGL ES是平台无关的,因此,需要在不同的平台系统上进行“本地化”,Android上就是通过FramebufferNaitveWindow这个中介将Android本地的窗口和OpenGL ES的窗口关联起来;

    • HWCComposer:进行Layer合成和负责Vsync信号的产生和控制;

      • 一般情况下芯片都支持硬件HWC;

      • 如果不支持HWC,或者大于支持的Layer个数上限,都使用软件(OpenGL ES)进行合成;

      • 无论是硬件或者软件合成,都必须遵守EGL接口;

    • 也可以使用OpenGL库进行合成;

      • 如果有GPU,那么加载对应的so,编写sharde程序去用GPU(硬件)合成;
      • 没有GPU那么使用纯软件的libGLES_android这个纯软件库去合成;
  • Buffer申请:

    • 每个App都有自己的界面,需要将界面数据绘制到1个或者多个buffer里面;

    • 那么,这些buffer哪儿来呢?如果APP自己申请buffer,填充好数据,再通过socket发送给SF,效率非常低,因此,通过让SF自己分配了,然后通过mmap映射出来,这样APP和SF操作同一块内存,APP写入数据SF会马上可以读到;

    • SF里面会调用HAL层的Gralloc模块进行buffer申请;

    • Gralloc模块又会通过驱动层的ashmem申请匿名内存,然后返回句柄fd给HAL,再传递给SF;

    • SF再通过Binder系统将fd传给App;

    • App往buffer里面写好数据之后,通过SurfaceFlinger交给FrameBuffer,才可以显示数据;

五、总结:

本文主要从框架层面对Android显示系统进行了介绍,里面最重要的就是SurfaceFlinger,它管理者众多模块完成了Android每一帧画面的显示。

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

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

相关文章

15分钟做完一个小程序,腾讯这个工具有点东西

我记得很久之前,我们都在讲什么低代码/无代码平台,这个概念很久了,但是,一直没有很好的落地,整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来,各大科技公司也都推出了很多 AI 代码助手&#xff…

跨标签通信的几种方式

以前面试被问到过,就了解了一下。还有其他方式,但是实际开发中,使用第一个就可以了 目录 1. 使用BroadcastChannel 2. 使用SharedWorker 3. 使用webSocket 1. 使用BroadcastChannel 它允许同源(协议、域名、端口都相同&#x…

深度神经网络模型压缩学习笔记二:离线量化算法和工具、实现原理和细节

文章目录 一、离线量化基础概念1)离线量化定义2)离线量化优缺点3)如何生产一个硬件能跑的量化模型?4)离线量化的类型5)如何计算scale,zero_point?6)离线量化概念7)PTQ与…

HTML详解(1)

1.HTML定义 HTML&#xff1a;超文本标记语言。超文本&#xff1a;通过链接可以把多个网页链接到一起标记&#xff1a;标签&#xff0c;带括号的文本后缀&#xff1a;.html 标签语法&#xff1a;<strong>需加粗文字</strong> 成对出现&#xff0c;中间包裹内容&l…

【21-30期】Java技术深度剖析:从分库分表到微服务的核心问题解析

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 文章题目&#xff1a;Java技术深度剖析&#xff1a;从分库分表到微服务的核心问题解析 摘要&#xff1a; 本…

Jmeter中的配置原件

2&#xff09;配置原件 1--CSV Data Set Config 用途 参数化测试&#xff1a;从CSV文件中读取数据&#xff0c;为每个请求提供不同的参数值。数据驱动测试&#xff1a;使用外部数据文件来驱动测试&#xff0c;使测试更加灵活和可扩展。 配置步骤 准备CSV文件 创建一个CSV文…

Redis持久化、主从及哨兵架构详解

Redis持久化 RDB快照&#xff08;snapshot&#xff09; 在默认情况下&#xff0c;Redis将内存数据库快照保存在名字为dump.rdb的二进制文件中。 你可以对Redis进行设置&#xff0c;让它在“N秒内数据集至少有M个改动”这一条件被满足时&#xff0c;自动保存一次数据集。 比…

双向链表、循环链表、栈

双向循环链表 class Node:#显性定义出构造函数def __init__(self,data):self.data data #普通节点的数据域self.next None #保存下一个节点的链接域self.prior None #保存前一个节点饿链接域 class DoubleLinkLoop:def __init__(self, node Node):self.head nodeself.siz…

【青牛科技】D1671 75Ω 带4级低通滤波的单通道视频放大电 路芯片介绍

概 述 &#xff1a; D1671是 一 块 带 4级 低 通 滤 波 的 单 通 道 视 频 放 大 电 路 &#xff0c; 可 在3V或5V的 低 电 压 下 工 作 。 该 电 路 用 在 有 TV影 象 输 出 功 能 的 产 品 上 面&#xff0c;比如 机 顶 盒 &#xff0c;监 控 摄 象 头 &#xff0c;DVD&#…

Linux服务器生成SSH 密钥对与 GitLab 仓库进行交互

目录 生成 SSH 密钥对 将公钥添加到 GitLab 测试 SSH 连接 生成 SSH 密钥对 在执行脚本的机器上打开终端&#xff0c;执行以下命令&#xff08;假设使用默认的 RSA 算法&#xff0c;一路回车使用默认设置即可&#xff0c;也可以根据需要指定其他算法和参数&#xff09;&…

关于SpringBoot集成Kafka

关于Kafka Apache Kafka 是一个分布式流处理平台&#xff0c;广泛用于构建实时数据管道和流应用。它能够处理大量的数据流&#xff0c;具有高吞吐量、可持久化存储、容错性和扩展性等特性。 Kafka一般用作实时数据流处理、消息队列、事件架构驱动等 Kafka的整体架构 ZooKeeper:…

在Unity中实现物体动画的完整流程

在Unity中&#xff0c;动画是游戏开发中不可或缺的一部分。无论是2D还是3D游戏&#xff0c;动画都能为游戏增添生动的视觉效果。本文将详细介绍如何在Unity中为物体添加动画&#xff0c;包括资源的准备、播放组件的添加、动画控制器的创建以及动画片段的制作与调度。 1. 准备动…

自定义协议

1. 问题引入 问题&#xff1a;TCP是面向字节流的&#xff08;TCP不关心发送的数据是消息、文件还是其他任何类型的数据。它简单地将所有数据视为一个字节序列&#xff0c;即字节流。这意味着TCP不会对发送的数据进行任何特定的边界划分&#xff0c;它只是确保数据的顺序和完整…

Spring Boot 3.4.0 发行:革新与突破的里程碑

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

android 11添加切换分屏功能

引言 自Android 7开始官方就支持分屏显示,但没有切换分屏的功能,即交换上下屏幕。直到Android 13开始才支持切换分屏,操作方式是:分屏模式下双击中间分割线就会交换上下屏位置。本文的目的就是在Android 11上实现切换分屏的功能。 下图是Android13切换分屏演示 切换分屏…

PyTorch基础05_模型的保存和加载

目录 一、模型定义组件——重构线性回归 二、模型的加载和保存 2、序列化保存对象和加载 3、保存模型参数 一、模型定义组件——重构线性回归 回顾之前的手动构建线性回归案例&#xff1a; 1.构建数据集&#xff1b;2.加载数据集(数据集转换为迭代器)&#xff1b;3.参数初…

JavaScript核心语法(3)

前两篇文章大概把JavaScript的基础语法讲了一下&#xff0c;这篇文章主要讲讲ES6的核心语法。ES6的核心语法说实话其实有点多&#xff0c;我重点挑一些经常在项目中用到的来讲&#xff0c;其他一些我没怎么见过的就不讲了。 目录 1.变量和常量 变量&#xff08;let 和 var&a…

爬虫开发(5)如何写一个CSDN热门榜爬虫小程序

笔者 綦枫Maple 的其他作品&#xff0c;欢迎点击查阅哦~&#xff1a; &#x1f4da;Jmeter性能测试大全&#xff1a;Jmeter性能测试大全系列教程&#xff01;持续更新中&#xff01; &#x1f4da;UI自动化测试系列&#xff1a; SeleniumJava自动化测试系列教程❤ &#x1f4da…

NIO三大组件

现在互联网环境下&#xff0c;分布式系统大相径庭&#xff0c;而分布式系统的根基在于网络编程&#xff0c;而netty恰恰是java领域的网络编程的王者&#xff0c;如果要致力于并发高性能的服务器程序、高性能的客户端程序&#xff0c;必须掌握netty网络编程。 NIO基础 NIO是从ja…

34 基于单片机的指纹打卡系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC&#xff0c;采用两个按键替代指纹&#xff0c;一个按键按下&#xff0c;LCD12864显示比对成功&#xff0c;则 采用ULN2003驱动步进电机转动&#xff0c;表示开门&#xff0c;另一个…