什么问题
在完成类似于微博这样的内容列表功能的时候,往往会因为各种原因导致列表滑动卡顿,无法给用户提供如丝般顺滑流畅的体验;
如何解决
那就要思考为什么会产生卡顿,从卡顿的原因入手,然后提供优化的方案;
原因分析
一般来说是两方面的问题,第一是数据计算,第二是图形渲染,一个由CPU来完成,一个由GPU来完成; 理想状况下,如果CPU和GPU的计算能力足够强大,界面是不会出现卡顿的情况的;但是由于移动设备由于自身特点和成本的限制,手机上搭载的CPU和GPU能力是无法达到那样的程度,于是便需要我们从这两方面的细节上进行优化;
由CPU造成的卡顿一般来说是因为运算太过复杂,造成CPU压力过大; 对于GPU来说往往是因为离屏渲染造成GPU的压力过大,iOS openGLES 框架中对视图的渲染一般来说分为两种,一种是在当前屏幕内进行渲染,一种是开辟缓存区进行视图的渲染,离屏渲染是很消耗性能的,原因有两个,一个是因为需要开辟新的缓冲区,二是因为渲染完毕之后要切换上下文;
所以总结来说,产生卡顿的原因有二,第一是CPU运算负荷过大,第二是CPU渲染压力过大;
优化方案
- 降低CPU运算负荷
- TableView的Cell高度进行提前计算好,然后进行读取设置,而不要放到委托方法里面进行计算;
- 尽量减少XIB 和 Storyboard的使用;
- 尽量避免重复的执行布局代码;
- 尽量少使用约束,因为约束最终还是会转换为Frame,大量的约束会增加CPU的计算量;
- 尽量使用颜色格式为32bit的图片,这样可以避免CPU再进行运算转换;
- 减少GPU渲染压力
- 避免切圆角,或者使用CoreGraphic绘制原角;
- 减少cell图层;对于一些重用性比较强的View可以使用CoreText去绘制;
- 按需绘制cell, 可以控制只渲染当前屏幕内展示的几个Cell;
- 降低内存压力
- 列表上尽量展示缩略图;
- 列表上的图片尽量缓存;
- Cell重用;