参考文章 http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/
又一次温习了YY大神性能优化文章,简单做下笔记。
屏幕显示原理
1、CPU计算好显示内容
2、GPU渲染完成将渲染放到帧缓冲区
3、视频控制器按照VSync信号读取帧缓冲区的数据
4、经过数模转换传递显示器显示
卡顿产生的原因
VSync信号来后,CPU开始计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制。由GPU进行变换、合成、渲染。将渲染结果提交到帧缓存区,等待下一次VSync信号来来是显示到屏幕上。由于垂直同步机制,在一定时间内,CPU或者GPU没有完成内容提交,则那一帧会丢弃,造成卡顿。
CPU和GPU无论哪个阻碍了显示流程都会造成掉帧现象。
CPU消耗资源原因解决方法
1.对象创建。
对象创建会分配内存、调整属性、甚至还有读取文件操作等,比较耗费CPU资源。
尽量用轻量对象代替重量对象。(比如不要使用Storyboard,其资源消耗比代码创建大许多)。
尽量推迟对象创建时间,将对象分散多个任务。
尽量使用复用,将复用对象放到缓存池。
2.对象调整。
对象的调整也是消耗资源的地方,比如CALayer(frame/bounds/transform)。
尽量避免调整视图层级,添加和移除视图。
3.对象销毁
对象销毁耗费资源不多。
尽可能将对象释放放到后台线程去释放。
4.布局计算
最为常见消耗CPU资源地方。
提前计算好布局。
5.Autolayout
对于复杂视图会严重消耗CPU资源。
用frame布局或者ComponentKit、AsyncDisplayKit等框架。
6.文本计算
当存在大量文本时,文本的宽高计算会占用很大一部分资源。
用 [NSAttributedString boundingRectWithSize:options:context:] 来计算文本宽高,用 -[NSAttributedString drawWithRect:options:context:] 来绘制文本,并放到后台线程进行。
使用CoreText绘制文本。
7.文本渲染
文本内容控件当绘制大量文本时,CPU压力会非常大。
使用CoreText、TextKit异步绘制。
8.图片的解码
图片设置到UIImageView或者CALayer.contents中才会解码,图片解码一般会在存在主线程。
后台线程先把图片绘制到CGBitmapContext中,然后从Bitmap直接创建图片。
9.图片绘制
将图像绘制放到后台线程。
GPU资源消耗原因和解决方案
1.纹理的渲染
所有的bitmap,图片、文本、栅格化内容,最终都要由内存提交到显存,绑定为GPUTexture。
减少短时间限时大量图片,尽可能多张图片合成为一张显示。
2.视图的混合
多视图重叠,混合过程会导致消耗很多GPU资源。
减少视图数量和层级活多视图预先渲染为一张图片展示。
3.图形的生成
CALayer上的处理会触发离屏渲染。
可以用CALayer.shouldRasterize属性,将离屏渲染转嫁到CPU上。
彻底方案:异步绘制图片。
简单总结:
布局计算预加载,渲染放置后台线程处理。