Core Animation Pipeline 流水线

在 iOS上,动画和视图的渲染其实是在另外一个进程做的(下面我们叫这个进程 render server),在 iOS 5 以前这个进程叫 SpringBoard,在 iOS 6 之后叫 BackBoard。

显示逻辑

  • 1、CoreAnimation提交会话,包括自己和子树(view hierarchy)的layout状态等;
  • 2、RenderServer解析提交的子树状态,生成绘制指令;
  • 3、GPU执行绘制指令;
  • 4、显示渲染后的数据;

 
image

Core Animation的绘制是通过Core Animation Pipeline实现,它以流水线的形式进行渲染,具体分为四个步骤:

  • Commit Transaction:

    可以细分为

    • Layout: 构建视图布局如addSubview等操作
    • Display: 重载drawRect:进行时图绘制,该步骤使用CPU与内存
    • Prepare: 主要处理图像的解码与格式转换等操作
    • Commit: 将Layer递归打包并发送到Render Server
  • Render Server:

    负责渲染工作,会解析上一步Commit Transaction中提交的信息并反序列化成渲染树(render tree),随后根据layer的各种属性生成绘制指令,并在下一次VSync信号到来时调用OpenGL进行渲染。

  • GPU:

    GPU会等待显示器的VSync信号发出后才进行OpenGL渲染管线,将3D几何数据转化成2D的像素图像和光栅处理,随后进行新的一帧的渲染,并将其输出到缓冲区。

  • Dispaly:

    从缓冲区中取出画面,并输出到屏幕上。

作者:Dywane
链接:https://www.jianshu.com/p/4174559d1ab7
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处

 

commit transaction

这个阶段是影响开发者最深的,它本身是由4个阶段组成的:

layout: 建立(set up)views,会调用重载的layoutSubviews方法,这里会发生view的创建,以及通过addSubview将layers添加进view层级中,将内容聚集起来,并做一些轻量的数据库查找(因为不能在这里停留太久,轻量级的操作可以是本地化字符串的查找以供应label的layout),这个过程通常是CPU密集型或者I/O密集型,关键词 layoutSubviews, view creation,addSubview,populate content, database lookups

display: 绘制views,这个阶段是如果drawRect有重载的话会通过drawRect绘制内容或者做字符串绘制,需要注意的是这个阶段实际上是CPU或者内存密集型的,由于这里是用core graphics渲染,所以通常用CGContext来渲染,也要避免在这里有过多的耗时  关键词 drawRect, string drawing

prepare commit:做一些额外的Core Animation工作,比如图像解码和图像转换,图像解码很容易理解,如果view层级中有图片,则会在这个阶段进行JPEG/PNG的解码,图像转换只是在存在有GPU不支持的图像时才会发生,典型的场景是对位图进行索引以避免特定的图像类型     关键词是image decoding,image conversion

commit:打包layers并提交给render server,这个过程是递归的,所以需要确保view树的平整以确保高效  关键词:package up layers and send to render server, recursive,expensive is layer tree is complex

how animations are produced

 
animation process

动画本身是一个三阶段的处理过程 ,两个在应用内,最后一个阶段在render server中,

第一个阶段是建立动画,更新view层级 通常是animateWithDuration:animaitons: ;

第二个阶段是准备及提交动画的阶段,即如上所述的4阶段的commit transaction,唯一不同的地方在于提交阶段,不仅需要提交view层级,也需要提交animation,因为我们需要将animation提交出去给render server以期以后的animation的更新不需要通过IPC与应用进行再次的沟通,这样更高效。

作者:纵横而乐
链接:https://www.jianshu.com/p/0bfba3d84cc8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

 

1、布局(Layout

调用layoutSubviews方法;

调用addSubview:方法;

会造成CPU和I/O瓶颈;

2、显示(Display

通过drawRect绘制视图;

绘制string(字符串);

会造成CPU和内存瓶颈;

每个UIView都有CALayer,同时图层有一个像素存储空间,存放视图;调用-setNeedsDisplay的时候,仅会设置图层为dirty。

当渲染系统准备就绪,调用视图的-display方法,同时装配像素存储空间。drawrect()

3、准备提交(Prepare

解码图片;

图片格式转换;

GPU不支持的某些图片格式,尽量使用GPU能支持的图片格式;

4、提交(Commit

打包layers并发送到渲染server;

递归提交子树的layers;

如果子树太复杂,会消耗很大,对性能造成影响;

尽可能简化viewTree;

iOSUI的绘图事务--Core Animation Pipeline--BackBoard(render server)的更多相关文章

  1. 绘图、Core Animation与硬件架构

    原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wan ...

  2. Core Animation学习总结

    文件夹: The Layer Beneath The Layer Tree(图层树) The Backing Image(寄宿层) Layer Geometry(图层几何学) Visual Effec ...

  3. iOS——Core Animation 知识摘抄(四)

    原文地址http://www.cocoachina.com/ios/20150106/10840.html 延迟解压 一旦图片文件被加载就必须要进行解码,解码过程是一个相当复杂的任务,需要消耗非常长的 ...

  4. Core Animation编程指南

    本文是<Core Animation Programming Guide>2013-01-28更新版本的译文.本文略去了原文中关于OS X平台上Core Animation相关内容.因为原 ...

  5. iOS开发基础知识:Core Animation(核心动画)

    Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core A ...

  6. iOS之核心动画(Core Animation)

      Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core ...

  7. iOS Instruments之Core Animation动画性能调优(工具复选框选项介绍)

    Core Animation工具用来监测Core Animation性能.它给我们提供了周期性的FPS,并且考虑到了发生在程序之外的动画(见图12.4) Core Animation工具提供了一系列复 ...

  8. iOS - Core Animation(核心动画)

    Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能.Core An ...

  9. IOS Core Animation Advanced Techniques的学习笔记(五)

    第六章:Specialized Layers   类别 用途 CAEmitterLayer 用于实现基于Core Animation粒子发射系统.发射器层对象控制粒子的生成和起源 CAGradient ...

随机推荐

  1. C# 之多线程(二)

    一.确定多线程的结束时间,thread的IsAlive属性 在多个线程运行的背景下,了解线程什么时候结束,什么时候停止是很有必要的. 案例:老和尚念经计时,2本经书,2个和尚念,一人一本,不能撕破,最 ...

  2. ASP.NET页面支持的指令

    页面的处理指令 页面指令的处理用于配置执行该页面的运行时环境.在ASP.NET中,指令可以位于页面的任何位置,但良好且常见的习惯是将其置于文件的开始部分.除此,页面指令的名称是不区分大小写的,且指令的 ...

  3. IDEA设置类注解和方法注解(详解)

    从eclipse工具到IDEA工具的转化,发现IDEA工具配置注释模板变的不一样了,不说废话了,直接开始 一.设置类注解模板(在创建类的时候自动填充模板) /** * @ProjectName: ${ ...

  4. centos文件/文件夹操作-检查磁盘、内存、cpu使用情况-vi操作命令

    Part1:CentOS文件/文件夹操作 1.新建文件夹 即创建目录 mkdir 文件名 新建一个名为test的文件夹在home下 vi source1 mkdir /home/test 注意:当创建 ...

  5. Git建立独立分支

    前言 在码云建立git项目后默认分支是master, 这里如果直接在码云新建分支, 会指定默认分支; 所以通过git 命令git checkout --orphan 新分支名 创建独立分支 创建 创建 ...

  6. Oracle数据库RowId

    RowId是什么? RowId是根据每一行数据的物理信息地址编码而成的一个位列,利用RowId可以快速定位到某一行. Oracle数据库编辑数据必须查出RowId,可以根据如下语句查询: select ...

  7. shutil的一些基本用法

    import shutil import time import tarfile # 将文件内容拷贝到另一个文件中 shutil.copyfileobj(open('a1', 'r'), open(' ...

  8. java 自定义异常处理

    package com.direct.work; import java.io.FileNotFoundException; import java.io.IOException; import ja ...

  9. BZOJ3812: 主旋律

    传送门 Sol 考虑容斥 强联通图反过来就是一些缩点后的 \(DAG\) 一个套路就是对出(入)度为 \(0\) 的点进行容斥 设 \(g_S,h_S\) 分别表示选了奇数个 \(0\) 入度和偶数个 ...

  10. 探索canvas画布绘制技术

    图片来自KrzysztofBanaś 下面我们开始尝试研究不同的绘图风格和技术 - 边缘平滑,贝塞尔曲线,墨水和粉笔,笔和印章和图案 -等等.事实证明,网上没有太多关于此的内容.在下面的示例中,您请大 ...