IOS渲染流程之提交图层数据至RenderThread进程

2023-11-04 10:20

本文主要是介绍IOS渲染流程之提交图层数据至RenderThread进程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大致链路

UIView/CALayer---->CoreAnimation./Core Graphics/Core Image---->GPU Drive-->GPU

image.png

图层树/视图树

一个UIView(视图)对应一个CALayer(图层),CALayer对应显示的数据其有个content代表Bitamp,渲染流程后的Bitmap被存储在content属性中(这个bitmpa也叫back store)UIView代表视图树对应的CALayer对应图层树

分离UIView和CALayer的目的在于:职责分离,可移植到MAC os上处理。对应于不同的交互UIView(负责响应用户交互,管理视图用于显示正确的图层树)是不同的,而CALayer(图层树)只负责提供Bitmap用于CoreAnimation框架读取组合,CoreAnimation框架可以复用

Core框架处理(组合)

CoreAnimation用于快速组合不同的CALayerr来显示到屏幕上 CoreGraphics用于实时计算,运行时绘制图像的核心图像库,

CoreImage,图像处理分析框架,对已经存在的图像进行处理。运行前处理图像

OPENGL

直接与GPU交互,由GPU的显卡提供商提供,用于2D3D图形渲染。

GPUDrive

链接到GPU

CALayer的content属性

主要职责:提供Bitmap用于CoreAnimatin框架组合显示 纹理就是一个2D图片 该content属性指向一块缓冲区(backing store)就是一个Bitmap纹理。该缓冲区保存的图片叫做寄宿图。

渲染流程基于顶点,基于纹理(直接提供图片):

1.使用图片纹理:contents属性配置

数据类型为id而不是CGImage是为了适配MAC OS系统,MAC OS系统中定义CFImage和NSImage都起作用

2.自己基于顶点来处理数据,手动绘制

顶点的需要自己计算纹理,光照信息用于片段主色器显示颜色

UIView中有一个drawRect方法用于实现自定义绘制,由Core Graphics处理绘制寄宿图, 实现原理:drawRect是CALayer的方法,CALayer中有一个delegete代理的属性,UIView实现了这个代理的协议,因此CALayer请求代理(UIView)得到数据,代理可以设置CALayer的寄宿图content属性

IOS渲染流水线:

各个框架都介绍了提供的数据及处理数据的方式 CoreAnimation用于组合不同的CALayer进行显示

用户更新界面

APP响应用户操作,更新视图树流程:(Application阶段,生成图元信息) 类似于Android的绘制流程 measure,layout,draw

IOS: layout,display,prepare,commit

layout(构建视图)

:添加子视图,调用layoutSubviews,计算视图布局 注意:减少视图层级,视图创建

Display(绘制视图)

Core Grphics进行视图绘制,得到图元信息(对比与Android的canvas在Surface中的内存信息)

prepare(CoreAnimation处理额外的图像解码和转换)
commit(打包发送图元信息):递归将图层信息发送到RenderServer进程,视图树层级越深,效率越低

参考文章:chuquan.me/2018/08/26/…

原文:IOS渲染流程之提交图层数据至RenderThread进程 - 掘金 (juejin.cn)

这篇关于IOS渲染流程之提交图层数据至RenderThread进程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/345096

相关文章

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

一个Java的main方法在JVM中的执行流程示例详解

《一个Java的main方法在JVM中的执行流程示例详解》main方法是Java程序的入口点,程序从这里开始执行,:本文主要介绍一个Java的main方法在JVM中执行流程的相关资料,文中通过代码... 目录第一阶段:加载 (Loading)第二阶段:链接 (Linking)第三阶段:初始化 (Initia