IOS性能优化笔记

参考文章 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上。

彻底方案:异步绘制图片。

简单总结:

布局计算预加载,渲染放置后台线程处理。

你可能感兴趣的:(IOS性能优化笔记)