bigbro

秘密基地,记录成长

秘密基地


hello, 我是王岩,人称大师兄(bigbro),一名iOS客户端开发小白,正在努力成为大神的路上

iOS Rendering Process

Rendering Process 技术框架

  • UIKit自身不具备在屏幕成像的能力,主要负责对用户操作时间的响应
  • 由UIView组成的是视图树,由CALayer组成的是图层树
  • 视图的职责就是创建并管理这个图层,以确保当子视图在层级关系中添加或者被移除的时候,他们关联的图层也同样对应在层级关系树当中有相同的操作。
  • Core Animation 是从Layer Kit演变而来的,所以做动画仅仅是 Core Animation 特性的冰山一角
  • Core Animation 本质上可以理解为是一个复合引擎,旨在尽可能快的组合屏幕上不同的显示内容。这些显示内容被分解成独立的图层,即 CALayer,CALayer 才是你所能在屏幕上看见的一切的基础
  • OpenGL ES 简称 GLES,即 OpenGL for Embedded Systems,是 OpenGL 的子集,通常面向图形硬件加速处理单元(GPU)渲染 2D 和 3D 计算机图形,例如视频游戏使用的计算机图形。
  • Core Graphics Framework 基于 Quartz 高级绘图引擎。它提供了具有无与伦比的输出保真度的低级别轻量级 2D 渲染。您可以使用此框架来处理基于路径的绘图,转换,颜色管理,离屏渲染,图案,渐变和阴影,图像数据管理,图像创建和图像遮罩以及 PDF 文档创建,显示和分析
  • Graphics Hardware 译为图形硬件,iOS 设备中也有自己的图形硬件设备,也就是我们经常提及的 GPU。
  • Core Animation 图层,即 CALayer 中包含一个属性 contents,我们可以通过给这个属性赋值来控制 CALayer 成像的内容。这个属性的类型定义为 id,在程序编译时不论我们给 contents 赋予任何类型的值,都是可以编译通过的。但实践中,如果 contents 赋值类型不是 CGImage,那么你将会得到一个空白图层。
  • Core Animation Pipeline:
    • 在 Application中布局UIKit视图控件间接的关联Core Animation图层
    • Core Animation图层相关的数据提交到 iOS Render Server,即 OpenGL ES & Core Graphics
    • Render Server 将与GPU通信把数据经过处理之后传递给GPU
    • GPU 调用 iOS 当前设备渲染相关的图形设备 Display
  • Core Animation Pipeline 的整个管线中 iOS 常规开发一般可以影响到的范围也就仅仅是在 Application 中布局 UIKit 视图控件间接的关联 Core Animation 图层这一级,即 Commit Transaction 之前的一些操作,
    • Layout,构建视图,减少视图对于视图树中同等级兄弟视图的约束依赖
    • Display,绘制视图,重载drawRect:,使用CPU和内存进行计算,使用不当会造成CPU负载过重
    • Prepare,额外的 Core Animation 工作
    • Commit,打包图层并将它们发送到 Render Server

基本完整的渲染过程

页面卡顿的成因

  • GPU 会等待显示器的 VSync 信号发出后,才进行新的一帧渲染和缓冲区更新
  • 在 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上。由于垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。CPU 和 GPU 不论哪个阻碍了显示流程,都会造成掉帧现象。所以开发时,也需要分别对 CPU 和 GPU 压力进行评估和优化。

相关参考文章留档

iOS 保持界面流畅的技巧

最近的文章

什么是TA系统?

TA,即开放式基金登记过户(TA: Transfer Agent)系统,是基金交易的重要组成部分,用于给投资者注册登记基金份额。TA系统处理的是基金申赎端的业务 TA系统具体处理的业务主要分为三类 账户业务,包括投资者开户、销户、客户端资料修改、账户登记等 交易业务,日常交易处理,如认购、申购(包括定期定额)、赎回、转托管、基金转换;特殊业务处理,如交易过户、账户冻结/解冻,份额冻结/解冻、份额强增强减;分红业务处理,如现金分红、红利再投资、分红方式变更 ...…

基金运作继续阅读
更早的文章

Tiercel源码学习——并行下载器的典型实现

总体框架 Manger是核心类,是功能接口类,提供对外和对内的API,负责任务的管理(新增、开始、暂停、取消、状态维护、并发控制、查询);session的管理(创建、reset、销毁) Cache负责缓存相关的工作,包括任务信息的缓存(1以pilist文件的形式保存执行中任务的元数据)、本地下载目录的维护 DownLoadTask是执行下载任务的实体,维护下载任务相关的描述信息,进度、下载速度、起止时间、下载URL SessionDelegate实现了URLSessionDataD...…

源码学习继续阅读