当前位置: 首页 > news >正文

Android与IOS渲染流程对比

目录

Android

CPU计算图元信息

GPU干预 几何阶段等后处理


Android

APP通过WindowManager统一提供所有Surface的缓冲区【不管是SurfaceView还是普通的布局流程都会将数据提交到Surface的BufferQuene中】 Java中的Surface是null,最终都是由Native层的Surface处理。

Native中的Surface持有的一个接口用于和bufferQuene交互,渲染到Surface上,其实是渲染到了BufferQuene中的GraphicBuffer,通过接口将GraphicBuffer提交到BufferQuene中

通过canvas的操作之前的版本渲染是在主线程执行会耗时卡死主线程,后续通过RenderThrad(FM层)单独处理渲染,主线程耗时操作不影响渲染处理,渲染过程中会使用到OPENGl 系统进程接收到BufferQuene之后SurfaceFlinger统一合成多个Surface也就是Layer

SurfaceFliger通过OpenGl生成图层放到缓冲区frameBuffer中,hwcomposer取出frameBuffer进行再次处理并放置到frameBuffer中。

Graph Core用于分配图形缓冲区,Display用于取出缓冲区数据进行展示

CPU计算图元信息

IOS的UIView对应一个CaLayer,Android的一个Window对应一个Surface(Surface也可由SurfaceView申请创建)

IOS的CALayer中有content属性存储要显示的bitmap数据(可由纹理2D图片直接使用),数据来源是由视图树的测量布局,渲染提交后将数据打包发送给RenderServer进程处理,RenderServer进程解析包,将其提交到缓冲区中,GPU进行读取进行几何阶段后面的处理

GPU干预 几何阶段等后处理

Android的是WindowManager将计算出所有的Window(Surface),也是通过CPU计算图元信息【测量布局绘制】,Surface中有一个BufferQuene类似于CALayer的content属性。

CPU计算图元信息的时侯只记录操作指令,具体的渲染操作由FM层维护的RenderServer线程去渲染通过openGl比较耗时 。

WindwoManager将所有信息给到SurfaceFlnger后,SurfaceFlinger先自己通过opengl操作一部分数据放到frameBuffer中,再通过hwComposer具体的合成策略去合成图层(本质也是几何阶段后面的处理),GraphCore用于分配图形缓冲区 Andrid和ios原理大致一样 都是CPU计算图元信息,IOS通过RenderServer进程去处理渲染,Android是FM层的RenderServer线程去处理渲染操作。 图元计算完成后都是GPU去取数据进行几何阶段后面的处理 。 Android除了用canvas设置Surface内容也可以使用OPENGL设置Surface。

相关文章:

  • Rust 语言常见的一些概念(上)
  • 《Pytorch新手入门》第一节-认识Tensor
  • 如何选一款适合自己的网页浏览器?-2023
  • linux杀毒软件下载、安装(在线安装、离线安装)
  • CentOS Stream9 修改阿里源
  • C++基础算法④——排序算法(快速、归并附完整代码)
  • 【ARM Trace32(劳特巴赫) 使用介绍 2 -- Trace32 cmm 脚本基本语法及常用命令】
  • 理解springboot那些过滤器与调用链、包装或封装、设计模式相关等命名规范,就可以读懂80%的springboot源代码,和其他Java框架代码
  • 在react中使用redux react-redux的使用demo
  • 【c++|opencv】二、灰度变换和空间滤波---1.灰度变换、对数变换、伽马变换
  • 我的创作纪念日1024
  • 国家数据局正式揭牌,数据专业融合型人才迎来发展良机
  • 【咕咕送书 | 第5期】国家数据局正式揭牌,数据专业融合型人才迎来发展良机
  • 39基于matlab的全局路径规划算法中的快速扩展随机树RRT路径规划算法及其改进方法
  • InfoHound:一款针对域名安全的强大OSINT工具
  • python3.6+scrapy+mysql 爬虫实战
  • [LeetCode] Wiggle Sort
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 2017-09-12 前端日报
  • CentOS从零开始部署Nodejs项目
  • es6--symbol
  • ES6系列(二)变量的解构赋值
  • isset在php5.6-和php7.0+的一些差异
  • Linux CTF 逆向入门
  • SpringCloud集成分布式事务LCN (一)
  • Vue全家桶实现一个Web App
  • 闭包--闭包作用之保存(一)
  • 番外篇1:在Windows环境下安装JDK
  • 技术发展面试
  • 配置 PM2 实现代码自动发布
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 我与Jetbrains的这些年
  • 在electron中实现跨域请求,无需更改服务器端设置
  • MyCAT水平分库
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​第20课 在Android Native开发中加入新的C++类
  • $GOPATH/go.mod exists but should not goland
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (十五)使用Nexus创建Maven私服
  • (算法)前K大的和
  • (图)IntelliTrace Tools 跟踪云端程序
  • (推荐)叮当——中文语音对话机器人
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .Net7 环境安装配置
  • .NET多线程执行函数
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [2]十道算法题【Java实现】