美文网首页
ios卡顿原因和性能优化

ios卡顿原因和性能优化

作者: iOS_YS_李 | 来源:发表于2022-03-28 15:42 被阅读0次

卡顿分析和性能优化

卡顿参考:

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瘦身优化

相关文章

  • iOS 性能优化二

    主要讲解界面卡顿原因/优化方案/离屏渲染 iOS 性能优化一iOS 性能优化二iOS 性能优化三 1. 开发中遇到...

  • IOS的性能优化包括哪几点

    iOS性能优化总结 iOS性能优化总结。关于 iOS 性能优化梳理: 基本工具、业务优化、内存优化、卡顿优化、布局...

  • iOS必读 - 收藏集 - 掘金

    iOS 性能优化总结 - iOS - 掘金关于iOS 性能优化梳理: 基本工具、业务优化、内存优化、卡顿优化、布局...

  • ios卡顿原因和性能优化

    卡顿分析和性能优化 卡顿参考: https://cloud.tencent.com/developer/artic...

  • iOS 性能优化

    iOS的性能优化主要可提现在以前的几个方面:卡顿优化、耗电优化、启动优化、安装包的瘦身。 1、卡顿优化 在了解卡顿...

  • Android-性能优化

    性能优化 卡顿 如何衡量卡顿 "卡顿" 产生的原因 Profile GPU Rendering 通用优化流程第一步...

  • iOS 优化方案

    一、性能优化基本方案 1、卡顿原因以及避免方案2、耗电优化3、启动优化4、安装包瘦身 二、卡顿优化原因以及避免方案...

  • iOS 性能优化总结

    转载自:iOS性能优化总结 卡顿产生的原因 在VSync信号到来后,系统图形服务会通过CADisplayLink等...

  • Activity 性能优化方案

    Activity 性能优化方案UI 卡顿原理UI卡顿常见原因优化手段 UI 卡顿原理人类大脑与眼睛对一个画面的连贯...

  • 21.性能优化

    关于iOS 性能优化梳理: 基本工具、业务优化、内存优化、卡顿优化、布局优化、电量优化、 安装包瘦身、启动优化、网...

网友评论

      本文标题:ios卡顿原因和性能优化

      本文链接:https://www.haomeiwen.com/subject/hippjrtx.html