iOS之性能优化iOS点点滴滴临时收藏

iOS优化(三)没错我还是滑动优化

2017-07-03  本文已影响1335人  大灰灰iOS

近期把滑动优化的一些经验整理了一下,在公司做了一次技术分享,和我之前的文章有一小部分重叠。现摘要如下,希望大家不吝赐教,共同讨论进步。

一.滑动优化的玄学

为什么说是玄学呢,因为大部分情况下的APP,用不到这些优化的点,过早的优化是恶魔,当真正出现性能问题的时候,再考虑这些方面的优化。

1.多个透明元素重叠显示的性能问题。

2.静态cell、多图待加载的优化

3.展示适合界面尺寸图片,不进行拉伸缩放。

4.imageNamed和imageWithContentsOfFile

这个知道的人比较多,因为缓存图片的消耗通常是肉眼可见的多。
常用的元素例如icon之类的,采用imageNamed:,系统会有缓存。
如果是较大或者不常用的图片资源,采用imageWithContentsOfFile:。

5.减少autolayout的使用

6.获取文件大小

7.NSDateFormatter产生较大消耗

8.图片解码:

二.cell高度预计算/缓存

三.离屏渲染

触发条件:CALayer 的 border、圆角、阴影、遮罩(mask),CASharpLayer 的矢量图形显示。
主要问题:GPU占满,CPU空闲
解决方法:
1.开启CALayer.shouldRasterize ,转嫁到CPU上;
2.粗暴画图/截图实现border和圆角;
3.砍死设计师。

最近拖延症有点厉害,这篇文章想写了很久都没写出来,我先摘要一部分思路出来。


拖延症晚期患者.png

曾经的需求是这样的:


注意需求的圈和头像之间是有空隙的.png

初期方案是图片下载完成后,裁成圆形,然后外面用贝塞尔画一个圈,根据不同的UI缓存不同多个带圈儿的图;
然而...神奇的产品第二版给我整出了无数个各种不同大小、间距、透明度的圈。这样就意味着我得缓存无数带着各色圈儿的图。

此时的心情.png

后来突然灵光一闪,单独设layer的圆角貌似不引发离屏渲染(有说法是iOS8之后)。所以后来方案变成,UIView嵌套一个UIImageView,只缓存裁剪过的图片。

但是这样的话,其实UIKit的创建要比读取画好的图更耗性能。所以这是个终极的问题,时间/空间,究竟选哪个。

四.图片的处理

1.SDWebImage的外层干了啥

喜闻乐见的拖延症晚期

这篇文章写了1/4的样子,详细的会在这篇文章里,十分心疼自己。下面简单说说SDWebImage的外层都干了啥:

2.项目中实际遇到的问题

我们做了个类似SDWebImage的东西,来实现神奇的需求,过程中遇到了一些问题:

五.ScrollView滑动优化

1.滑动时的代理

2.特殊情况

drag完,正decelerating时(didEndDecelerating尚未调用),强行再次drag(单指停止滑动,双指连环滑)

3.VVWeibo的做法

4.最迷的问题

UICollectionViewLayout的prepareLayout调用了过多次数,是因为shouldInvalidateLayoutForBoundsChange:这个方法灾难的调用了多次,newBounds的x和y实际上随着滑动一直在变,return YES的话就一直重新布局,最后用magicNumber存他的size,当size变化才返回YES,就很强行的解决了。

六.魔鬼般的视频播放

这里涉及业务逻辑过多,我也不方便多写,就写一些过程中遇到的问题:

Conference

http://wereadteam.github.io/2016/05/03/WeRead-Performance/ 微信读书 iOS 性能优化总结
http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/ iOS 保持界面流畅的技巧
http://blog.sunnyxx.com/2015/05/17/cell-height-calculation/ 优化UITableViewCell高度计算的那些事
http://tech.glowing.com/cn/practice-in-uiscrollview/ UIScrollView 实践经验
《High Performance iOS Apps》这本真是神书,有兴趣深入学习优化的可以去看看,中文的貌似有美团技术团队翻译的

简书已经弃用,欢迎移步我的小专栏:
https://xiaozhuanlan.com/dahuihuiiOS

上一篇下一篇

猜你喜欢

热点阅读