首先要感谢作者ibireme,同时声明这篇文章为本人拜读大神作品的总结笔记,以列表清单的方式将iOS性能优化点列了出来,方便对照来进行性能优化,如需转载请注明原文作者ibireme以及原文地址。
原文:《iOS 保持界面流畅的技巧》(如果打不开说明你被墙了。窃喜~)
主要是减少cpu与gpu的消耗资源压力
一、cpu的资源消耗解决方案
1. 创建对象时,尽量用轻量的对象代替重量的对象。比如CALayer 比 UIView要轻量许多,不需要响应触摸事件的控件可以用CALayer来显示(CALayer控件只能在主线程创建和操作,避免通过Storyboard创建视图对象)。
2. 尽量推迟对象的创建时间,并把对象的创建分散到多个任务中去。(如果对象可以复用,并且复用的代价比释放、创建新对象要小,那么这类对象应当尽量复用)
3. 应尽量减少对UIView的与CALayer相关的属性修改。(比如frame、bounds、transform、center等)
4. 尽量避免视图层次调整,以及视图添加和移除。
5. 避免容器内持有大量对象同时销毁,如果对象可以放到后台去释放,难就挪到后台线程去。
6. 尽量减少视图的布局计算,应当在后台提前计算好视图布局,并且对视图布局进行缓存。(参考第3点,不要多次、频繁的计算和调整视图的这些属性)
7. Autolayout虽能提高开发效率,但随着视图数量增长,Autolayout会严重影响CPU的性能。如果你不想手动调整frame,可以使用ComponentKit、AsyncDisplayKit等框架。
8. 如果一个界面包含大量文本,文本的宽高计算会占用很大一部分资源,并且不可避免。
9. 当你需要显示大量文本时,最好自定义文本控件,用TextKit或者CoreText对文本异步绘制。
10. 当你用UIImage 或 CGImageSource 的相关方法创建图片时,应当在后台线程先把图片绘制到 CGBitmapContext 中,从 Bitmap 直接创建图片。(目前常见的网络图片库都做了这个处理)
11. 图像绘制尽量放到后台线程,因为CoreGraphic方法通常是线程安全的,图像显示时再回到主线程。
二、GPU的资源消耗解决方案
1. 避免短时间内大量图片的显示,如果可以,尽可能将多张图片合成为一张进行显示。
2. 尽量不要图片和视图的大小超过机器的纹理尺寸。http://iosres.com/
3. 你应该尽量减少视图数量和层次,并在不透明的视图里标明opaque=YES以避免无用的Alpha通道合成。(你也可以像第二点那样,把多个视图预先合成为一张图片来显示)
4. 应避免使用圆角、阴影、遮罩等属性,如必须,可将CALayer.shouldRasterize设置为YES。最好UI可以提供圆角、阴影等图片,或者将需要显示的图像在后台线程绘制为图片。