高通平台Display显示架构

目录

  • 一、显示整体架构
  • 二、SurfaceFlinger
  • 三、HWC
  • 四、Gralloc
  • 五、DisplayManagerService
  • 六、WindowManagerService


一、显示整体架构

在这里插入图片描述


二、SurfaceFlinger

SurfaceFlinger是一个系统服务,如:audioflinger等等,这个系统服务主要实现了Surface的建立、控制、管理等功能。换种说法就是,在Android 的实现中它是一个service,提供系统范围内的surface composer功能,它能够将各种应用程序的2D、3D surface进行组合。

SurfaceFlinger是整个Android系统渲染的核心进程。所有应用的渲染逻辑最终都会来到SF中进行处理,最终会把处理后的图像数据交给CPU或者GPU进行绘制,在每一个应用中都以Surface作为一个图元传递单元,向SF这个服务端传递图元数据。
目前SurfaceFlinger中支持两种合成方式,一种是Device合成,一种是Client合成。SurfaceFlinger 在收集可见层的所有缓冲区之后,便会询问Hardware Composer应如何进行合成。

  • 1、Device合成
    Device合成方式是相对与硬件合成来说的,其合成方式是,将各个Layer的内容用GPU渲染到暂存缓冲区中,最后将暂存缓冲区传送到显示硬件。这个暂存缓冲区,我们称为FBTarget,每个Display设备有各自的FBTarget。Device合成,之前称为GLES合成,我们也可以称之为GPU合成。Device合成,采用RenderEngine进行合成。
  • 2、Client合成
    Client合成就是用专门的硬件合成器进行合成HWComposer,所以硬件合成的能力就取决于硬件的实现。其合成方式是将各个Layer的数据全部传给显示硬件,并告知它从不同的缓冲区读取屏幕不同部分的数据。

三、HWC

HWC是Android中进行窗口合成和显示的HAL层模块,通常是由OEM实现并完成,为SurfaceFlinger提供硬件支持。

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

HWC合成机制:

  1. SurfaceFlinger向HWC提供所有Layer的完整列表,让HWC根据其硬件能力,决定如何处理这些Layer
  2. HWC会为每个Layer标注合成方式,表明是通过GPU还是通过HWC合成
  3. SurfaceFlinger负责先把所有注明GPU合成的Layer合成到一个输出Buffer,然后把这个输出Buffer和其他Layer(注明HWC合成的Layer)一起交给HWC,让HWC完成剩余Layer的合成和显示

四、Gralloc

在android中,HAL层的gralloc库负责申请图形缓冲区的所有工作,HAL层之上的Surface、BufferQueue最终都是调用gralloc库去申请图形缓冲区,然后返回给上层一个buffer_handle_t

gralloc分配framebuff图形缓冲区
gralloc调用gralloc_alloc_framebuffer()分配framebuffer的内存,其核心是对fb设备/dev/graphics/fb或者/dev/fb执行mmap(),映射到用户空间

gralloc分配普通图形缓冲区
普通图形缓冲去则是通过gralloc_alloc_buffer()分配内存的


五、DisplayManagerService

DisplayManagerServices主要是用来管理显示的生命周期,它决定如何根据当前连接的物理显示设备控制其逻辑显示,并且在状态更改时,向系统和应用程序发送通知。

默认支持4种显示类型:

  1. LocalDisaplay:本地物理屏幕显示设备,DMS启动之后通过SurfaceFlinger获取物理屏数据
  2. OverlayDisplay: 模拟辅助显示设备, 开发者选项->模拟辅助显示
  3. WIFIDisplay: 无线连接显示设备, Wifi连接显示的物理屏幕
  4. VirtualDisplay: 虚拟显示设备,如VR ,屏幕录制

提供上层访问的主要接口:

  • public Display[ ] getDisplays():获取当前所有有效的logic display列表
  • public Display getDisplay(int displayId):根据displayId获取logic display的信息
  • public void registerDisplayListener(DisplayListener listener, Handler handler):
    注册显示器监听事件,用来监听显示器的新增,删除,变更等事件
  • public void unregisterDisplayListener(DisplayListener listener):
    取消显示器监听事件

六、WindowManagerService

WindowManagerService是WindowManager的管理者,负责窗口的启动、添加和删除,WindowManager会监控窗口的生命周期、输入事件、屏幕方向、旋转、动画、位置等多种状态,同时会将所有窗口的元数据发送给SurfaceFlinger,SurfaceFlinger使用这些数据在屏幕上合成Surface。

在这里插入图片描述


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

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

相关文章

通过升级nginx完美修复nginx相关漏洞

目录 前言1 安全评估报告的漏洞信息1.1 nginx漏洞概况1.2 nginx漏洞详细信息1.3 安装的软件信息 2 问题分析3 Nginx从1.18版本升级到1.26版本的步骤与说明3.1 查看现有Nginx配置参数3.2 下载新版本Nginx3.3 配置新版本Nginx3.4 编译新版本Nginx3.5 备份旧版本Nginx的二进制文件…

github 设置中文,亲测有效

点进去 安装 选上面第二个,不行再选第一个 GitHub - maboloshi/github-chinese: GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese)

常见网络攻击方式及防御方法

1. DDOS攻击(分布式拒绝服务攻击) 概念:借助于C/S(客户端/服务器)技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDOS攻击,从而成倍地提高拒绝服务攻击的威力。防护方…

springboot 配置加密,jasypt加解密命令

位置:Maven仓库中\org\jasypt\jasypt\1.9.3 java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input123456 passwordmysalt algorithmPBEWithMD5andDES ----ENVIRONMENT----------------- Runtime: Oracle Corporation Java HotSpot™…

sideloadly 苹果自签和sidestore手机续签ipa记录

sideloadly 地址:https://sideloadly.io/#download 直接安装对应系统软件,然后吧ipa 拖到里面续签,缺点每7天需要电脑续签 如果续签保留数据需要对应的位置开启 enable file sharing 勾选 和 bundle id 修改 注意的地方需要电脑和手机appi…

气象观测站:时刻注视着天空的变化

在广袤无垠的地球上,气象观测站时刻注视着天空的变化,记录着大自然的脉动。它们是我们理解和应对气候变化、极端天气事件的重要工具。 一、气象观测站的基本构成 气象观测站包括一系列的气象仪器和设备,用于测量和记录各种气象参数。这些参数…

软考《信息系统运行管理员》-2.5信息系统运维管理系统与专用工具

2.5信息系统运维管理系统与专用工具 信息系统运维管理系统功能框架 信息系统运维管理系统是站在运维管理的整体视角,基于运维流程,以服务为导向的业务 服务管理和运维管理支撑平台,提供统一管理门户,最终帮助运维对象实现信息系…

【AI原理解析】-AI native模型微调

目录 一、模型微调的定义与重要性 二、模型微调的步骤 三、模型微调的优势与挑战 四、模型微调的应用场景 五、模型微调的未来发展方向 一、模型微调的定义与重要性 定义:模型微调是指在预训练模型的基础上,使用特定任务的数据对模型进行再训练&am…

Zabbix 配置SNMP监控

Zabbix SNMP监控介绍 Zabbix提供了强大的SNMP监控功能,可以用于监控网络设备、服务器和其他支持SNMP协议的设备。SNMP(Simple Network Management Protocol,简单网络管理协议)是一种广泛用于网络管理的协议。它用于监控网络设备&…

CVPR 2024最佳论文分享:打破刚性的超分辨率图像处理GNN

CVPR 2024最佳论文分享:打破刚性的超分辨率图像处理GNN CVPR(Conference on Computer Vision and Pattern Recognition)是计算机视觉领域最有影响力的会议之一,主要方向包括图像和视频处理、目标检测与识别、三维视觉等。近期&am…

分布式数据库HBase:从零开始了解列式存储

在接触过大量的传统关系型数据库后你可能会有一些新的问题: 无法整理成表格的海量数据该如何储存? 在数据非常稀疏的情况下也必须将数据存储成关系型数据库吗? 除了关系型数据库我们是否还有别的选择以应对Web2.0时代的海量数据? 如果你也曾经想到过这些问题, 那么HBase将是…

C++: 左值引用和右值引用

目录 概念: 理解: 左值引用,右值引用 左值引用能否给右值取别名? 右值引用能否给左值取别名? 引用的意义是什么? 左值和右值对自定义类型有什么区别吗? move的妙用! 没有优化…

LLMs之CriticGPT:CriticGPT的简介、安装和使用方法、案例应用之详细攻略

LLMs之CriticGPT:CriticGPT的简介、安装和使用方法、案例应用之详细攻略 目录 CriticGPT的简介 1、简介 2、CriticGPT的方法 2.1、CriticGPT的训练方法 2.2、CriticGPT的批评生成方法 3、局限性 4、后续步骤 CriticGPT的安装和使用方法 CriticGPT的案例应用…

“proxy_pass“ directive is duplicate

后面发现是nginx.conf里面proxy pass这里有两个,注释其中一个并重新运行即可!

AI并不是开发者的敌人,而是帮助他们实现更高效工作的得力助手。

AI是在帮助开发者还是取代他们? 在软件开发领域,生成式人工智能(AIGC)正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试,AI工具正在成为开发者的得力助手。然而,这也引发了对开发者职业前…

基于主流SpringBoot进行JavaWeb开发的学习路线

目录 一、学习路线 (1)第一部分(Web前端开发的技术栈) (2)第二部分(Web后端开发) 二、学习之后必备的技能 三、学习Web开发的基础与未来的收获 学完这一类知识目标:…

Mybatis-01 原理

一. JDBC式编程 在 jdbc 编程中,我们最常用的是 PreparedStatement 式的编程,我们看下面这个例子; Connection conn null; PreparedStatement ps null; ResultSet rs null;try {// 1. 注册驱动Class.forName("com.mysql.jdbc.Drive…

Sping源码总览

源码地址:https://github.com/spring-projects/spring-framework 仓库地址:https://gitcode.net/qq_42665745/spring/-/tree/master 文章目录如下: 实现一个简单的Bean容器Bean 的定义、注册、获取Bean有参构造实例化Bean属性注入资源加载器…

C++11使用std::future和std::promise实现线程同步和异步通信

std::future 和 std::promise 是 C11 引入的标准库特性,用于实现线程间的异步通信和同步。它们提供了一种机制,使一个线程能够生成一个值或异常,并让另一个线程获取这个值或异常。 (线程A中设置结果) std::promise 用于设置异步操作的结果(线…

【Jupyter Notebook与Git完美融合】在Notebook中驾驭版本控制的艺术

标题:【Jupyter Notebook与Git完美融合】在Notebook中驾驭版本控制的艺术 Jupyter Notebook是一个流行的开源Web应用程序,允许用户创建和共享包含实时代码、方程、可视化和解释性文本的文档。而Git是一个广泛使用的分布式版本控制系统,用于跟…