WindowManager中Surface申请流程

news2024/10/7 12:20:46

WindowManager中Surface申请流程

  • 1、SurfaceFlinger 和 WindowManager
  • 2、WindowManager中Surface申请流程
    • 2.1 WMS侧添加界面时scheduleTraversals()
    • 2.2 Window更新过程时scheduleTraversals()
    • 2.3 Surface初始化申请
    • 2.4 简易时序图
  • 3、对应画布Layer创建
    • 3.1 简易时序图

android12-release


1、SurfaceFlinger 和 WindowManager

WMS 概述 – “窗口管理员” 了解一下大致印象

SurfaceFlinger 接受缓冲区,对它们进行合成,然后发送到屏幕。WindowManager 为 SurfaceFlinger 提供缓冲区和窗口元数据,而 SurfaceFlinger 可使用这些信息将 Surface 合成到屏幕

WindowManager 会控制 window 对象,它们是用于容纳 view 对象的容器。window 对象始终由 surface 对象提供支持。WindowManager 会监督生命周期、输入和聚焦事件、屏幕方向、转换、动画、位置、变形、Z 轴顺序以及窗口的许多其他方面。WindowManager 会将所有窗口元数据发送到 SurfaceFlinger,以便 SurfaceFlinger 可以使用这些数据在屏幕上合成 Surface。

WMS "窗口"都必须向 SurfaceFlinger 申请相应的 Layer 得到图形的缓冲的使用权。(注意这里Surface是Java层的,要区别于OpenGL ES的本地窗口Surface。)

2、WindowManager中Surface申请流程

2.1 WMS侧添加界面时scheduleTraversals()

WMS侧添加界面

WindowManagerImpl.java#addView -> WindowManagerGlobal.java#addView -> ViewRootImpl.java#setView -> Session extends IWindowSession.Stub#addToDisplayAsUser -> WindowManagerService.java#addWindow 流程中ViewRootImpl.java#setView时会执行到scheduleTraversals() 做一次 doTraversal() -> performTraversals()

在这里插入图片描述

2.2 Window更新过程时scheduleTraversals()

  1. updateViewLayout 更新过程通过WindowManagerImpl、WindowManagerGlobal、ViewRootImpl层层调用,最终调用doTraversal/performTraversals 方法
  2. relayoutWindow 通过IWindowSession.aidl#relayout来让 wms 向 SurfaceFlinger 申请画板Layer。(这里需要View为viewVisibility == View.VISIBLE)(frameworks/base/services/core/java/com/android/server/wm/Session.java)
  3. mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null) 用于接收显示信号Vsync,下一帧渲染执行mTraversalRunnable
  4. performMeasure/performLayout/performDraw最终分别调用到内部view的measure/layout/draw。(这里应用自定义View注意的地方)

这里Activity窗口onResume执行makeVisible()可见之后查看 ActivityThread.java#handleResumeActivity -> WindowManagerImpl.java#updateViewLayout -> WindowManagerGlobal.java#updateViewLayout -> ViewRootImpl.java#setLayoutParams -> ViewRootImpl.java#scheduleTraversals -> Choreographer.java#postCallback/ViewRootImpl.java#mTraversalRunnable -> ViewRootImpl.java#doTraversal -> ViewRootImpl.java#performTraversals -> ViewRootImpl.java#performMeasure/performLayout/performDraw
在这里插入图片描述在这里插入图片描述

2.3 Surface初始化申请

  1. mSurface = new Surface()初始时一个空壳,直到 updateViewLayout 更新时 mSurface.copyFrom(mSurfaceControl) 赋值
    在这里插入图片描述
  2. Surface.java / SurfaceControl.java ⇒ android_view_Surface.cpp / android_view_SurfaceControl.cpp 通过JNI方式调用创建底层C++本地实现,其中client = SurfaceComposerClient::getDefault() 是熟悉的 SurfaceFlinger 派生的“代表” SurfaceComposerClient

2.4 简易时序图

在这里插入图片描述

3、对应画布Layer创建

SurfaceComposerClient和SurfaceFlinger通过Bn/Bp端Client Binder连接调用,创建Layer
frameworks/base/core/jni/android_view_SurfaceControl.cpp
frameworks/native/libs/gui/SurfaceComposerClient.cpp
frameworks/native/libs/gui/ISurfaceComposerClient.cpp
frameworks/native/services/surfaceflinger/Client.cpp
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
在这里插入图片描述

3.1 简易时序图

在这里插入图片描述

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

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

相关文章

【Vue3 页面美化】常用组件库推荐

Vue 作为一款深受广大群众喜欢的前端框架,拥有众多优秀的开源 UI 组件库,这里整理了一下供大家参考。 这几套框架主要用于后台管理系统和移动端的制作,方便开发者快速开发。 一、PC 端 UI 库 1.1 Element Plus 官网地址:https…

基于阿里云免费算力自建LLM(类GPT)大模型

这会是一个关于 ChatGPT 的系列文章,主要记录老胡日常使用 ChatGPT 的思考和一些有趣的开源项目,然后这些信息我都会汇总到一个 ChatGPT 信息群(免费,目的是为了交流),有兴趣的朋友可以联系我进群 🥳。 目前开源的 LLM…

sql总理论加实践

一、基础查询 DQL语法 SELECT 字段列表 1.设置别名 SELECT 字段1[别名],字段二[别名]......FROM 表名 WHERE 条件列表; 2.查询多个字段 SELECT 字段1,字段2,字段3......FROM 表名; SELECT * FROM 表名; 3.去除重复记录 DISTANT FROM 表明列表 WHERE 条件列表(条件…

Stable Diffusion: 利用Latent Diffusion Models实现高分辨率图像合成

原文链接: Stable Diffusion: 利用Latent Diffusion Models实现高分辨率图像合成 High-Resolution Image Synthesis with Latent Diffusion Models 01 The shortcomings of the existing works?02 What problem is addressed?03 What are the keys to the solutio…

RESTful API 中的 HTTP 方法有哪些?

RESTful API 中的 HTTP 方法有哪些? RESTful API 是一种基于 HTTP 协议的 API 设计风格,它使用 HTTP 协议中的方法来定义对资源的操作。在 RESTful API 中,HTTP 方法主要用于表示对资源的操作,例如获取、创建、更新和删除资源。本…

持 PMP®证书增持 CSPM-2证书,怎么弄?

2023年起,持有PMP证书的朋友可以直接增持一个同等级证书CSPM-2,不用重新考试,不用重新学习,原PMP证书不影响正常使用,相当于多了一个国标项目管理领域的证书。 第一步准备资料 1、填写能力评价表(简历和业绩不用填&am…

自毁便签:MaiFile Privnote

自毁便签:MaiFile Privnote为您提供安全可靠的信息传递 在当今数字化时代,隐私保护成为了人们关注的焦点。MaiFile Privnote作为一种创新的在线服务,为用户提供了一种安全、便捷的方式来发送私密信息,确保信息在传递后能够自动销…

SSM校园二手交易微信小程序-计算机毕设 附源码87210

SSM校园二手交易微信小程序 目 录 1 绪论 1.1 研究背景 1.2国内外研究现状 1.3论文结构与章节安排 2 校园二手交易微信小程序系统分析 2.1 可行性分析 2.1.1技术可行性分析 2.1.2经济可行性分析 2.1.3操作可行性分析 2.1.4需求分析 2.2 系统流程分析 2.2.1 数据流程…

【HTTP】HTTP协议 HTTPS 协议

目录 一、HTTP 🌷1、HTTP是什么? 🌷2、HTTP的工作过程 🌷3、 抓包工具Fiddler的使用 🌷4、HTTP的协议格式(重点) 🌷5、HTTP请求 5.1 请求地址URL 5.2 方法method 5.3 认识 …

日志是什么?耗时2个月搞懂Linux日志

这里写目录标题 日志基本介绍日志管理服务日志轮替 日志基本介绍 日志是用来记录重大事件的工具。 日志文件是重要的系统信息文件,其中记录了很多重要的系统事件。包括用户的登录信息,系统的启动信息,系统的安全信息,邮件相关信息…

如何使用电脑压缩jpg图片大小?jpg图片怎么压缩大小kb?

在学习时经常需要将一些高分辨率的图片添加到你的学术论文或者演示文稿中,但是这些高清图片往往会占用大量的存储空间,导致文件变得非常大,难以上传或者发送,所以需要把这些jpg图片压缩(https://www.yasuotu.com/jpg&a…

如何在前端项目中使用icon图标 (iconfont和remixicon以及Materialicon)

1.使用阿里图标库iconfont iconfont链接 把你所需要用的图标加入购物车中 把购物车中的图标加入到项目中 此时有两种使用方 直接下载文件,然后在项目中引入css文件就可以直接使用 2.使用在线链接 注意:在线链接服务仅供平台体验和调试使用,…

定时任务最简单的3种实现方法

定时任务在实际的开发中特别常见,比如电商平台 30 分钟后自动取消未支付的订单,以及凌晨的数据汇总和备份等,都需要借助定时任务来实现,那么我们本文就来看一下定时任务最简单的几种实现方式。 TOP 1:Timer Timer 是…

宽带毫米波数模混合波束赋形

从无线移动通信发展的脉络来看,第1、2 代(1G、2G)先后分别从模拟和数字两种方式解决了人们之间的语音通信需求,第3 代(3G)开始增加对数据业务的支持,第4 代(4G)系统着重满…

一场专属开发者的技术盛宴——华为开发者联创日首站登陆深圳

技术无界,创想无限。2023年6 月 17 日,华为开发者联创日深圳首站成功举办。本次活动由华为技术有限公司主办,深圳市龙岗数字创意产业走廊管理中心协办,并得到了华为全国首个数字创意产业方向的创新中心——华为(龙岗&a…

【历史上的今天】6 月 20 日:MP3 之父出生;富士通成立;谷歌收购 Dropcam

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 6 月 20 日,在 2016 年的今天,中国超级计算机“神威太湖之光”摘得世界冠军。超级计算机,被称为“国之重器”,是…

基于html+css的图展示136

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【Python 随练】猴子吃桃问题

题目: 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时…

【CEEMDAN-VMD-GRU】完备集合经验模态分解-变分模态分解-门控循环单元预测研究(Python代码实现)​

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

我敢说,80%项目经理都不知道这3个进度管理方法

早上好,我是老原。 我离开腾讯之后,曾经加入一家互联网创业公司。 要知道,当你在一个大公司的平台上做事做习惯之后,觉得一些流程都应该是严谨的、完备的、按计划进行的。 但是当时,经常出现一个致命问题——进度拖…