关于IOS优化

最近看了很多关于IOS优化的文章,现在大概来总结一下.

列表优化:

卡顿产生的原因

首先我们要了解优化任务的底层运行原理是什么,因为只有了解了运行原理。才可以知道着手从哪里优化。事半功倍。

我们知道iOS设备大部分情况下,屏幕刷新频率是60hz,每隔16.67ms会进行一次屏幕刷新。每次刷新时,需要CPU和GPU配合完成一次图像显示。其主要流程如下:

1.CPU创建View 设置其属性(frame, background,color等)

2.创建backImages setContents将image传给layer,或者通过draw绘制图形。

3.准备。core animation将layer发送到 render server前的一些准备工作,比如图片解码等

4.提交 coreanimation将layers打包通过ipc发送到render server

render server:

设置用来渲染的OpenGL triangles 如果有动画,还需要计算动画的参数

渲染这些可见的triangles 将结果提交到视频缓冲区

视图控制器以60hz品读读取缓冲区内容显示到显示器,如果在16.67ms内没有完成提交,则会被丢弃。

得出的结论就是,无论是GPU还是CPU都有各自的任务,无论哪个压力过大,都会造成卡顿。

通过instrument等测试工具可以发现,tableview在滑动过程中,cpu占用率高,而在空闲的时候 cpu占用率低。

主线程cpu占用率高,子线程cpu占用率低

解决方案

预加载:

滑动时CPU占用过高,16.67ms内无法完成内容提交—>导致卡顿

滑动时CPU占用率高,但空闲时CPU占用率底—>CPU占用分布特点

利用CPU空闲时间预加载,降低滑动时CPU占用峰值—>解决卡顿

如何预加载:

创建列表前找时机预加载。如启动时候,viewDidLoad runloop空闲时等

加载内容:列表将要滑动的时候会加载到的本地缓存图片等,需要耗时的资源。

动态预加载:

在IOS10以后,UITableView和UICollectionView提供了预加载机制,IOS12开始prefeatching做了优化,不再是和cell同时并发进行,而是cell加载完成之后串行开始prefeatch,从而优化了流畅度。

在IOS10以前我们可以用UIScrollview的代理方法进行预加载的操作

加载内容:

cell的高度, subView的布局计算。(cell少用autolayout)

拉取网络数据

网络图片

其他耗时的资源

线程优化

为什么要用多线程:

因为在IOS中,UIKit大部分的API都需要在主线程中调用,特别是一些耗时的操作,如view的创建,布局和渲染默认都是在主线程上完成的。如果主线程的任务过多,就会影响到开发的效率,造成卡顿。将非主线程必须的任务,移到子线程中,减轻主线程的负担。

推荐在子线程中进行的任务:

1.图片解码

2.文本渲染 UILabel和UITextView都是在主线程渲染的,当显示大量文本的时候 CPU的压力会非常大 用TextKit或最底层的CoreText对文本异步绘制。它的优势非常大,CoreText对象创建好后,能直接获取文本的宽高等信息,避免了多次计算。

缓存:

缓存的内容可以是

UIView,view的创建代价很大,一些可以服用的view可以cache,例如UITableView为我们实现的cell的服用。

图片,图片涉及磁盘IO和解码,十分耗时,可以考虑缓存。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,083评论 1 32
  • 看到一篇关于讲列表优化,讲的很好,特转摘过来。原文链接 这一篇文章是iOS性能优化系列文章的的第二篇,主要内容是关...
    林伟彦笔记阅读 2,036评论 1 23
  • 这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过...
    RobinYu阅读 1,361评论 0 2
  • 演示项目 在开始技术讨论前,你可以先下载我写的 Demo 跑到真机上体验一下:https://github.com...
    cosWriter阅读 1,058评论 0 1
  • 一、如何提高一个应用程序的性能?1、使用ARC减少内存失误,dealloc需要重写并对属性置nil。2、重用。3、...
    金歌漫舞阅读 968评论 2 6