iOSUI的绘图事务--Core Animation Pipeline--BackBoard(render server)
Core Animation Pipeline 流水线
在 iOS上,动画和视图的渲染其实是在另外一个进程做的(下面我们叫这个进程 render server),在 iOS 5 以前这个进程叫 SpringBoard,在 iOS 6 之后叫 BackBoard。
显示逻辑
- 1、CoreAnimation提交会话,包括自己和子树(view hierarchy)的layout状态等;
- 2、RenderServer解析提交的子树状态,生成绘制指令;
- 3、GPU执行绘制指令;
4、显示渲染后的数据;
Core Animation的绘制是通过Core Animation Pipeline实现,它以流水线的形式进行渲染,具体分为四个步骤:
Commit Transaction:
可以细分为
- Layout: 构建视图布局如
addSubview
等操作 - Display: 重载
drawRect:
进行时图绘制,该步骤使用CPU与内存 - Prepare: 主要处理图像的解码与格式转换等操作
- Commit: 将Layer递归打包并发送到Render Server
- Layout: 构建视图布局如
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

动画本身是一个三阶段的处理过程 ,两个在应用内,最后一个阶段在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)的更多相关文章
- 绘图、Core Animation与硬件架构
原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wan ...
- Core Animation学习总结
文件夹: The Layer Beneath The Layer Tree(图层树) The Backing Image(寄宿层) Layer Geometry(图层几何学) Visual Effec ...
- iOS——Core Animation 知识摘抄(四)
原文地址http://www.cocoachina.com/ios/20150106/10840.html 延迟解压 一旦图片文件被加载就必须要进行解码,解码过程是一个相当复杂的任务,需要消耗非常长的 ...
- Core Animation编程指南
本文是<Core Animation Programming Guide>2013-01-28更新版本的译文.本文略去了原文中关于OS X平台上Core Animation相关内容.因为原 ...
- iOS开发基础知识:Core Animation(核心动画)
Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core A ...
- iOS之核心动画(Core Animation)
Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core ...
- iOS Instruments之Core Animation动画性能调优(工具复选框选项介绍)
Core Animation工具用来监测Core Animation性能.它给我们提供了周期性的FPS,并且考虑到了发生在程序之外的动画(见图12.4) Core Animation工具提供了一系列复 ...
- iOS - Core Animation(核心动画)
Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能.Core An ...
- IOS Core Animation Advanced Techniques的学习笔记(五)
第六章:Specialized Layers 类别 用途 CAEmitterLayer 用于实现基于Core Animation粒子发射系统.发射器层对象控制粒子的生成和起源 CAGradient ...
随机推荐
- MUI框架 picker日期选择器实例
MUI官方文档点我 (一)准备工作,下载相关的js.cs文件,地址 (二)新建普通html页面 1)引入相关js.cs文件 2) 一个input,记录下id: <form> <lab ...
- this,小心!
this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在JS中,由于 javascript的动态性(解释执行,当然也有简单的预编译过程),this ...
- .net mvc 获取acion 返回类型
1..net core 中获取 public override void OnActionExecuted(ActionExecutedContext context) { var descripto ...
- windows 下运行 tomcat
本节是以 tomcat 7.0 为例,描述在 windows 系统上从下载到运行 tomcat 的步骤 https://tomcat.apache.org/download-70.cgi 下载后解压缩 ...
- fzou 1759 Super A^B mod C
Problem 1759 Super A^B mod CAccept: 456 Submit: 1488Time Limit: 1000 mSec Memory Limit : 32768 ...
- 浏览器同源策略与ajax跨域方法汇总
原文 什么是同源策略 如果你进行过前端开发,肯定或多或少会听说过.接触过所谓的同源策略.那么什么是同源策略呢? 要了解同源策略,首先得理解“源”.在这个语境下,源(origin)其实就是指的URL.所 ...
- Java关闭钩子的应用 - Shutdown Hook
背景 在开发中,遇到这种情况,多个线程同时工作,突然一个线程遇到了fetal的错误,需要立即终止程序,等人工排查解决了问题之后重新启动.但是这样会有一个问题,程序终止时,其他线程可能正在进行重要操作, ...
- libevent学习笔记 —— 第一个程序:计时器
用libevent写个定时器其实步骤不多: 1.初始化libevent 2.设置事件 3.添加事件 4.进入循环 由于定时事件触发之后,默认自动删除,所以如果要一直计时,则要在回调函数中重新添加定时事 ...
- mybatis大框架
MyBatis 开源的数据持久化层框架 实体类与SQL语句之间建立映射关系 一:MyBatis前身是IBatis,本是Apache的一个开源的项目, 基于SQL语法,简单易学 ,是耦合度降低,方便 ...
- 本地调试 谷歌浏览器报错:跨域问题处理 Access-Control-Allow-Origin
前端在本地,调试,就经常的就是会遇到 调用接口,提示跨域了. 如你要访问 http://****/api/user chrome 浏览器 报错: XMLHttpRequest cannot load ...