Android渲染流程

news2024/10/7 2:20:43

目录

缓冲区的不同生命周期代表当前缓冲区的状态:

多个源

ViewRootImpl:

Android4.0:

Android5.0:


Android应用程序调用SurfaceFliger将测量,布局,绘制好的Surface借助GPU渲染显示到屏幕上。

一个Activity对应一个PhoneWindow,Dialog等也是一个PhoneWindwo

每个Window都有一块Surface用来显示布局(特殊:当SutfaceView可见时会通过SurfaceControl像SurfaceFlinger申请持有一块Surface),Surface在Java中是null,nativa才有值, 通过Surface的lockCanvas可以锁定一块画布进行渲染,通过unlockCanvas释放画布提交到Surface中,所以视图数据是在Surface中的,那么Surface是如何给到GPU的?

Surface可以理解为就是Layer

Surface处理完成之后,通过WindwoManager统一提交给SurfaceFlinger进行处理(利用缓冲区实现) Surface对应一块画布canvas内部有多个缓冲区,行成一个BufferQuene缓冲队列,通过缓冲队列作为载体。

缓冲区的不同生命周期代表当前缓冲区的状态:

image.png

  • Free空闲

上层应用可通过Suraface的lockCanvas申请一块画布进行操作

  • Dequeeued出列

缓冲区被上层使用代表正在对这块画布进行操作

  • Queue入列

上层完成绘制【代表Surface的unlockCanvas被调用】等待SurfaceFlinger的合成

  • Acquired:被获取

代表当前缓冲区正在被下层使用SurfaceFlinger正在合成Layer也就是Surface合成,合成完之后又会回到Free状态往复

因此 发送给SurfaceFlinger的数据是 通过WindowManager将当前所有Window的元数据一起发送,SurfaceFlinger获取到Layer后一起合成 SurfaceFlinger进程用于响应Vsync信号(又分为Vsync-app和Vsync-两个信号),分配图形缓冲区,合成图形缓冲区数据,接受来自多个源的数据缓冲区进行合成发送到显示屏。

多个源

除了通过大多数情况的Window读取BufferQuene数据是通过统一的Vsync调用 onDraw获取的canvas的数据;还有通过SurfaceView【其通过SurfaceControl申请的缓冲区】

ViewRootImpl:

控制窗口渲染:链接WMS和SurfaceFlinger的通信者

Android4.0:

引入三缓冲技术,编舞者,Vsync

Android5.0:

引入RenderThread线程(fm层维护),把之前cpu直接操作绘制指令(opengl)的部分交给了单独的渲染线程,减少主线程工作。

image.png

由于前面的零零碎碎太多,每个地方都是一个小点分析的,所以最后一张图总结下(可以按照这个大致流程去跟我之前写的文章):

阅读上和体验上没有太照顾读者的感受,抱歉,后续会整理这些零零碎碎的笔记

原文链接:Android渲染流程 - 掘金 (juejin.cn)

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

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

相关文章

Cannot find namespace ‘NodeJS‘.

最近在使用自定义指令做防抖节流的时候,使用ts定义定时器类型的时候报的错误,记录一下: 解决方法: 在根目录下找到env.d.ts,或者在根目录中新建一个文件(global..d.ts)在文件中导出NodeJS命名空…

OpenLayers入门,OpenLayers从vue的assets资源路径加载TopoJson文件并解析数据叠加到地图上,以加载世界各国边界为例

专栏目录: OpenLayers入门教程汇总目录 前言 本章以加载世界各国边界的TopoJson格式数据为例,讲解如何使用OpenLayers从vue的assets资源路径加载TopoJson文件并解析数据叠加到地图上。 GeoJson介绍 GEOJSON是gis地图中常用的数据格式,制作地图时用于存储各种地理数据,使…

使用 node.js 简单搭建Web服务 使用node简单搭建后端服务 使用node搭建服务

使用 node.js 简单搭建Web服务 使用node简单搭建后端服务 使用node搭建服务 1、初始化项目2、安装 Express.js Web 服务框架3、创建 app.js 主入口文件, 并且实现 GET、POST请求4、启动服务5、请求测试 1、初始化项目 例如项目名为 node-server-demo mkdir node-server-demo进…

sd 模型笔记之 SDXL

C站有个创作者Copax,他创作了许多模型和LoRA,其中有一个SDXL1.0的模型非常受欢迎,叫Copax TimeLessXL。 TimeLess的字面意思是永恒,不过有一首英文歌也是TimeLess,歌词大意是唯爱永恒。 这个SDXL1.0的模型更新到了8…

Azure机器学习 - 使用与Azure集成的Visual Studio Code实战教程

本文介绍如何启动远程连接到 Azure 机器学习计算实例的 Visual Studio Code。 借助 Azure 机器学习资源的强大功能,使用 VS Code 作为集成开发环境 (IDE)。 在VS Code中将计算实例设置为远程 Jupyter Notebook 服务器。 关注TechLead,分享AI全维度知识。…

从历史的探索到RFID固定资产管理的未来

在人类历史上,技术的进步一直是推动社会和工业发展的关键因素。其中,RFID技术的出现是一个重要的里程碑。让我们回顾一下RFID技术的历史,并探讨如何将其应用于固定资产管理,为企业提供更高效、智能的解决方案。 RFID(R…

开发一个简单的管理系统,前端选择 Vue 还是 React?

目录 比于React,我更喜欢使用Vue 低代码平台的前端框架采用Vue的优势有哪些? JNPF-Web-Vue3 的技术栈介绍 (1)Vue3.x (2)Vue-router4.x (4)Ant-Design-Vue3.x (5&#xf…

安装pip install pointnet2_ops_lib/.

安装这个的时候一直报错 总结原因还是版本不一致的问题,参考的博客https://blog.csdn.net/weixin_45144684/article/details/132525431 最后在这个链接里面https://anaconda.org/nvidia/cuda-toolkit成果安装11.5的粗大tookit就成功了, 最后附上所有包的…

大数据-Storm流式框架(七)---Storm事务

storm 事务 需求 storm 对于保证消息处理,提供了最少一次的处理保证。最常见的问题是如果元组可以被 重发,可以用于计数吗?不会重复计数吗? strom0.7.0 引入了事务性拓扑的概念,可以保证消息仅被严格的处理一次。因此可…

JMeter的使用,傻瓜式学习【上】

目录 前言 1、JMeter元件及基本使用作用域(简述) 1.1、基本元件 1.2、作用域的原则 1.3、元件执行顺序 2、JMeter三个重要组件 2.1、线程组 案例: 2.2、HTTP请求 2.3、查看结果树 响应体中,中文乱码解决方案&#xff1…

python爬虫—使用xpath方法进行数据解析

1. 背景信息 爬取安居客二手房源信息 URL地址:https://wuhan.anjuke.com/sale/?fromnavigation 2. 代码实现 import requests from lxml import etreeif __name__ __main__:# 1.指定URLurl "https://wuhan.anjuke.com/sale/?fromnavigation"# 2.U…

c语言字符类型及其大小

c语言字符类型及其大小 c语言字符类型及其大小 c语言字符类型及其大小一、整形int类型二、字符型char类型三、浮点型四、类型限定符五、sizeof()函数六、32操作系统字符类型大小比较 一、整形int类型 二、字符型char类型 三、浮点型 四、类型限定符 五、sizeof()函数 sizeof&a…

Python + RobotFramework 测试框架分享二(项目实践)

项目介绍: 本篇文章是Python + RobotFramework测试框架分享的第二篇文章,介绍的是基于RobotFframework+python构建的一个射频自动化测试工具。包含WIFI的射频测试,BT的射频测试以及校准功能的一个工具。 项目背景: RF: 也就是常说的射频,英文:Radio Ffrequency WIFI:…

软测推荐第二期:10本高质量测试书籍

在不断发展的软件开发领域,测试是质量的守护者,确保产品不仅满足功能要求,而且提供无缝的用户体验。随着软件复杂性的增加,对完善的测试方法和见解的需求也随之增加。 上次给大家推荐了五本书,获得了大家的积极反馈&a…

【C语言】realloc()函数详解(动态内存开辟函数)

🦄个人主页:修修修也 🎏所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 一.realloc()函数简介 我们先来看一下cplusplus.com - The C Resources Network网站上realloc()函数的基本信息: 1.函数功能 可以看到,realloc()函数的功能是:更改动…

请教设计师全屋定制有哪些门道

⬛装修很难绕开全屋定制,设计师来告诉你有哪些前期就要留意的事项🌠⬛全屋定制板材📚常用的板材:颗粒板、密度板、生态板、多层板、欧松板、实木指接板’对于家装来说,建议大家选大品牌和环保达标的。常用板材的厚度&a…

信锐-框式交换机基础运维命令

目录 一,telnet登录配置 二,ssh登录配置 三,Web登录 四,S框模式切换 五,时间配置 六,用户和密码设置 七,config模式 八,查看交换机版本 九,查看板卡信息 十&am…

Python——文件操作

目录 一、文件操作——基础 1.1打开文件 1.2关闭文件 1.3文件访问模式 二、文件读写 2.1 在文件中写入数据 2.2读取文件的数据 2.3 读数据(readlines) 2.4 读数据(readline) 三、文件相关操作 3.1 文件重命名 3.2 删除…

骨传导耳机到底好用吗,2023年骨传导耳机该怎么选

骨传导耳机到底好用吗,骨传导耳机是一种完全颠覆你听音体验的黑科技!不仅能够让你享受音乐的同时保护你的听力,还能让你感受到一种前所未有的新鲜感。很显然,骨传导耳机是真的好用,现在市面上有许多品牌的骨传导耳机&a…

Octave Convolution学习笔记 (附代码)

论文地址:https://export.arxiv.org/pdf/1904.05049 代码地址:https://gitcode.com/mirrors/lxtgh/octaveconv_pytorch/overview?utm_sourcecsdn_github_accelerator 1.是什么? OctaveNet网络属于paper《Drop an Octave: Reducing Spatia…