instruments工具监测
Time Profiler->Call Tree Options
Separate By THread
按线程划分
Invert Call Tree
逆向Call Tree, 方便查看调用顺序
Hide System Libraries
隐藏系统库
Core Animation->Debug Options
Color Blended layers
监测图层混合情况,没有混合的部分为绿色,混合最严重的部分为红色,大量图层混合会消耗GPU的时间
Color Copied images
监测图片颜色格式,如果GPU不支持当前图片的颜色格式,会将其交给CPU预先进行格式转化,并且这张图片被标记为蓝色.(Apple的GPU值解析32bit的颜色格式,RGBA)
Color immediately
设置调试颜色每帧更新(一般不用)
Color Compositing-Fast-Path Blue
对任何直接使用OpenGL绘制的图层高亮
Flash Updated Regions
对重绘的内容高亮成黄色(软件层面使用Core Graphics 绘制的图层)
Color Hits Green and Misses Red
前面以述
Color Offscreen-Renderded Yellow
前面以述
Color Non-Standard Surface Formats
Apple 开发文档没注释(一般不用)
AsyncDisplayKit开源框架
简介
为使iOS界面刘畅,性能极致优化.FaceBook创建并开源了AsyncDisplayKit库.
基本原理
将文本和布局的计算、渲染、解码、绘制都通过各种方式异步进行,尽量优化UIKit及Core Animation 必须在主线程执行的相关操作.
分析:沿用UIView->CALayer方式,实现了ASDislayNode->UIView的映射关系. ASDisplayNode是线程安全的,它可以在后台线程创建和修改.Node刚创建时,并不会在内部新建UIView和CALayer,直到第一次在主线程访问view或layer属性时,它才会在内部生成对应的对象.当它的属性(比如frame/transform)改变后,它并不会立即同步到其持有的view或layer去,而是把被改变的属性保存到内部的一个中间变量,稍后在需要时,再通过某一个机制一次性设置到内部的view或layer.
图层预合成
分析:有时一个layer会包含很多sub-layer,而这些sub-layer并不需要响应触摸事件,也不需要进行动画和位置调整.ASDK为此实现了一个被称为pre-composing的技术,可以把这些subkayer合成渲染为一张图片.当ASNode替代UIView和CALayer后,设置layer backed后,ASNode甚至可以通过预合成来避免创建内部的UIView和CALayer.
优势:通过这种方式,把一个大的层级,通过一个大的绘制方法绘制到一张图上,性能会获得很大提升,CPU避免创建UIKit对象的资源消耗,GPU避免了多张texture合成和渲染的消耗,更少的bitmap也意味着更少的内存占用.
异步并发
ASDK把布局计算、文本排版、图片/文本/图形渲染等操作都封装成较小的任务,并利用GCD异步并发执行.使用ASNode相关的控件,那么这些并发操作会自动在后台执行,无需进行过多配置.
Runloop任务分发
分析:所有针对ASNode的修改和提交,总有些任务需放到主线程执行.当出现这种任务时,ASNode会把任务用ASAsyncTransaction (Group)封装并提交到一个全局的内容中去.ASDK在主线程runloop中注册了一个observer,监视BeforeWaiting和Exit事件,在runloop进入休眠前CoreAnimation处理完事件后,ASDK就会执行该loop内提交的所有任务.
滑动列表的预加载
解决方案
对象创建
分析:对象的创建会分配内存、调整属性、甚至还有读取文件等操作,比较消耗CPU资源.尽量采取轻量对象,尽量放到后台线程处理,尽量推迟对象创建时间.(UIView/CALayer)
对象调整
分析:frame、bounds、fransform及视图层次等属性调整很耗费CPU资源.尽量减少不必要属性的修改,尽量避免调整视图层次、添加和移除视图.
布局计算
分析:对属性的调整非常消耗资源,尽量提前算好布局,在需要时一次性调整好对应属性.
Autolayout
分析:随着视图数量的增长,Autolayout带来的CPU消耗会呈指数级上升.推荐视同AsyncDisplayKit、Masonry等第三方框架.
文本渲染
分析:屏幕上能看到的所有文本内容控件,包括UIWebView,底层都是通过CoreText排版、绘制为位图显示的.常见的文本控件,其排版与绘制都是在主线程进行的,显示大量使CPU压力很大.对此解决方案唯一就是自定义文本控件,用CoreText对文本异步绘制.(很麻烦,开发成本高)
图片解码
分析:当用UIImage或CGImageSource创建图片时,图片数据并不会立刻解码.图片设置到UIImageView或CALayer.Contents中去,并且CALayer被提交到GPU前,CGImage中的数据才会得到解码.这一步是发生在主线程的,然后从Bitmap直接创建图片.
图像绘制
分析:图像的绘制通常是指用那些以C开头的方法把图像绘制到画布中,然后从画布创建图片并显示的一个过程.CoreGraphics方法通常是线程安全的,可以异步绘制,主线程回调.
纹理渲染
分析:尽量减少短时间内大量图片的显示,尽可能将多张图片合成一张进行显示.
视图混合
分析:尽量减少视图层次和数量,并在不透明的视图里标明opaque属性以避免无用的Alpha通道合成.
图形生成
分析:尽量避免离屏渲染,尽量采用异步绘制,尽量避免使用圆角、阴影、遮罩等属性.必要时用静态图片实现展示效果,也可尝试光栅化缓存复用属性.CALayer属性shouldRasterize设置为YES.