iOS的卡顿问题主要是GPU和CPU的限制,
CPU:
1.对象的创建,释放,属性调整。这里尤其要提一下属性调整,CALayer的属性调整的时候是会创建隐式动画的,是比较损耗性能的。
2.视图和文本的布局计算,AutoLayout的布局计算都是在主线程上的,所以占用CPU时间也很多 。U
3.文本渲染,诸如UILabel和UITextview都是在主线程渲染的
4.图片的解码,这里要提到的是,通常UIImage只有在交给GPU之前的一瞬间,CPU才会对其解码。
GPU:
1.视图的混合。比如一个界面十几层的视图叠加到一起,GPU不得不计算每个像素点药显示的像素
2.离屏渲染。视图的Mask,圆角,阴影。
3.半透明,GPU不得不进行数学计算,如果是不透明的,CPU只需要取上层的就可以了
4.浮点数像素
优化方案2种
第一种 :(——使用一个些成熟的框架,例如:用AsyncDisplayKit来写复杂的界面。能够获得异步绘制,预先加载等诸多好处。不过,需要一定的学习成本,前段时间看了下网易新闻的安装包,就使用了AsyncDisplayKit
大多数性能要求较高的界面就是图文混排,比如微博Feed,微信朋友圈等界面。建议使用成熟的图文混排引擎,因为这些引擎一般支持异步绘制,并且做了大量优化。推荐两个 YYKit,DTCoreText.)
第二种就用你的技术底蕴(
异步绘制
把复杂的界面,放到后台线程里绘制成一个bitmap,然后再显示。虽然有些延迟,不过换来的却是平滑的界面。
建议使用成熟的库,比如SDWebImage等,能够在后台进行图片解码,减少CPU的使用。
对于复杂的TableView,可以对Cell视图的各个控件的大小,位置后台进行预计算,并且缓存起来。这样保证在heightForRow和cellForRow中不进行大量的计算。
因为Layer是一个轻量级的视图结构,它不接受通知,不接受触摸,不在响应链。所以,相对于UIView来说,它的性能较好。并且CALayer及其子类是可以使用GPU渲染的,能够硬件加速。
将两个CALayer的内容合成到一个Bitmap里,然后显示。能够减轻GPU的压力
)
网友评论