卡顿分析和性能优化
卡顿参考:
https://cloud.tencent.com/developer/article/1030608
https://www.jianshu.com/p/6120550caa94?ivk_sa=1024320u
性能优化参考:
https://www.jianshu.com/p/fe566ec32d28
https://www.jianshu.com/p/00e042ca2e72
大多卡顿分析其实就是cpu占用过高,fps刷新慢,runloop跑的时间太长等
引发卡顿的原因也有很多
1,逻辑设计不合理,比如业务判断的封装,复杂耗时任务的处理,数据量过大的读取和插入,以及线程出现了死锁,抢锁,复杂页面绘制渲染的不合理,大量的图文混排,大量的触发离屏渲染,页面创建的方式纯代码和Storyboard等。
2.在for循环中创建大量控件,同时为了避免每次执行的重复创建,在创建之前又先判断是否存在,存在的话则移除,都是十分损耗性能并卡顿的,而这一手段确是很多开发者惯用的,他们会说,三个按钮我循环创建的代码量很小,分批创建需要写三次,代码十分臃肿。这是错误理论。因为for循环创建本身是没问题的,但是多次的执行移除控件是损耗性能的
3.文本布局
4.文本计算
如果一个界面中包含大量文本(比如微博微信朋友圈等),文本的宽高计算会占用很大一部分资源,并且不可避免。如果你对文本显示没有特殊要求,可以参考下 UILabel 内部的实现方式:用 [NSAttributedString boundingRectWithSize:options:context:] 来计算文本宽高,用 -[NSAttributedString drawWithRect:options:context:] 来绘制文本。尽管这两个方法性能不错,但仍旧需要放到后台线程进行以避免阻塞主线程。
如果你用 CoreText 绘制文本,那就可以先生成 CoreText 排版对象,然后自己计算了,并且 CoreText 对象还能保留以供稍后绘制使用。
5.文本渲染
屏幕上能看到的所有文本内容控件,包括 UIWebView,在底层都是通过 CoreText 排版、绘制为 Bitmap 显示的。常见的文本控件 (UILabel、UITextView 等),其排版和绘制都是在主线程进行的,当显示大量文本时,CPU 的压力会非常大。对此解决方案只有一个,那就是自定义文本控件,用 TextKit 或最底层的 CoreText 对文本异步绘制。尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText 对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText 对象占用内存较少,可以缓存下来以备稍后多次渲染。
注意:结合4.5亮点如何你看过我之前的IM高性能解决方案就知道为什么IM优化中涉及到了使用CoreText进行文本渲染的图文混排了。并提前渲染,计算尺寸,缓存高度,富文本等。
一两个控件性能无所谓,但是大量的控件加上实时的刷新性能就容易卡顿了。
6.图片的解码
当你用 UIImage 或 CGImageSource 的那几个方法创建图片时,图片数据并不会立刻解码。图片设置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 GPU 前,CGImage 中的数据才会得到解码。这一步是发生在主线程的,并且不可避免。如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到 CGBitmapContext 中,然后从 Bitmap 直接创建图片。目前常见的网络图片库都自带这个功能。
这也是SD的图片解码底层原理
7.图像的绘制
图像的绘制通常是指用那些以 CG 开头的方法把图像绘制到画布中,然后从画布创建图片并显示这样一个过程。这个最常见的地方就是 [UIView drawRect:] 里面了。由于 CoreGraphic 方法通常都是线程安全的,所以图像的绘制可以很容易的放到后台线程进行。一个简单异步绘制的过程大致如下(实际情况会比这个复杂得多,但原理基本一致):
注意:这里是贝塞尔曲线的绘制,优化方案就是直接在画布上去绘制。
8.尽可能使用轻量级的控件,比如UIview的轻量级控件CAlayer。如果UIview就是个展示,没有任何UI交互可以这样使用,同时避免多次调用他的属性如frame,bounds
比如你的一个控件A和控件B的frame一样,很多开发者倾向直接 initWithFrame:self.testView.frame。觉得代码量精简了。其实是不建议使用的
9 tableView不要动态创建子控件,尽可能使用懒加载,尽量少设置透明度.
10内存中大量家在图片的显示,
1.可以合成一张图片(看需求)
2.快速滑动的分段加载(runloop)
11.耗电优化如地图定位,cpu负载,大量算法等引发的
12网络优化,重复请求,效率不高的请求,轮询请求等
13数据读写优化和数据库优化
14a pp启动优化
15 app瘦身优化
网友评论