参考地址:https://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

很久以前就看过这篇文章,但是也只是看过就过了,没有去整理思路,最近有时间把一些点整理一下.

通读下来可以总结一下对性能优化,在这里也就是提高界面流畅度的宗旨只有一句话唯而已:把能异步执行的都尽量异步执行.

在我这篇里主要记录一下文本的异步绘制,先上两个视频,异步处理前后的差异,我直接把YYFPSLabel拿过来用了,检测FPS的变化情况:

可以看到,在滑动很快的时候,FPS最低已经达到了20几.

经过异步绘制处理之后,可以看到无论如何滑动,FPS一直保持在60.

这是我写的一个小demo:https://github.com/alan12138/Interview-question/tree/master/3/AsyncLabel,也就是上面运行案例的代码.

前后对比的效果就是将cell中的label使用UILabel和使用自定义label之后的效果.

首先,其实这种优化是对流畅度非常敏感的界面来说的,一般场景很少需要做这样的优化,并且,只有在文字非常多且复杂,滑动非常快的时候才能明显的感觉到差别.

如果项目中某个地方需要优化,而你也想尝试一下使用YYAsyncLayer,并且对文字的处理比较简单,可以将demo中的ATLabel拿来参考,当然直接使用YYLabel是最好的选择,ATLabel只是用来演示YYAsyncLayer的使用,并且非常简陋.

不谈YYLabel内部各种复杂的处理,他是直接继承自UIView,自己造了个Label控件出来,但是从异步绘制的角度来说,其原理就是,将本来UILabel所做的绘制文字的工作拿过来自己做,并放在子线程异步执行.

下面简单分析一下YYAsyncLayer的内部原理:

其中涉及到了四个类:

YYAsyncLayer

YYTransaction

YYSentinel

YYDispatchQueuePool

先从YYTransaction开始说起,每一个YYTransaction对象相当于一个异步绘制任务.

ATLabel中在以下需要调用重绘的方法中都提交了contentsNeedUpdated任务,

查看commit方法可以看到,他使用了一个Set来存储这些任务.并且在其中调用了一个方法:YYTransactionSetup

看一下YYTransactionSetup方法:

可以看到这个方法中的代码只会执行一次,也就是在第一次commit 的时候执行一次,只会便不会再执行了.方法内部初始化了一个Set对象,用来收集绘制任务,并做了runloop监听,在runloop等待和退出之前,也就是空闲的时候,调用回调方法.

而在这个回调方法中,便是执行所有收集到的绘制任务.

综上所述,在label需要重绘的时候,作者将绘制任务收集起来,并在runloop空闲的时候一起执行.

接下来看一下作者是如何执行这些任务的:

可以看到每个绘制任务都是调用display方法,而display中执行的_displayAsync方法便是对异步绘制的处理,也就是说每个绘制任务最终都会调用到这个方法.

_displayAsync方法:

在ATLabel中可以看到

作者重写了layerClass方法,并返回了YYAsyncLayer.class,也就是将当前label的layer替换为了YYAsyncLayer.然后便可以通过实现YYAsyncLayer的代理方法newAsyncDisplayTask.将ATLabel我们自己对文字绘制的实现异步执行,可以看到是在异步代码块中.

上面圈出来的便是对代理中task.display代码实现的调用.

回到YYAsyncLayer的 _displayAsync方法,可以看到最后回到主线程将绘制内容赋值,便完成了整个流程.

最后,还有作者一些细节性的处理我没有写下来,有兴趣可以自己研究一下,比如计数器的使用,hash的处理,队列数量的控制,作者短短的几百行代码凝聚了很多智慧.





iOS性能优化-异步绘制的更多相关文章

  1. 【腾讯Bugly干货分享】微信读书iOS性能优化

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/578c93ca9644bd524bfcabe8 “8小时内拼工作,8小时外拼成长 ...

  2. iOS性能优化:Instruments使用实战

    iOS性能优化:Instruments使用实战   最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instrument ...

  3. IOS 性能优化的建议和技巧

    IOS 性能优化的建议和技巧 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelo ...

  4. iOS性能优化总结

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

  5. iOS 性能优化收集

    iOS 性能调试 instrument Instrument Instrument之Core Animation工具 避免图层混合 ①.确保控件的opaque属性设置为true,确保backgroun ...

  6. iOS 性能优化总结

    卡顿产生的原因 在 VSync信号到来后,系统图形服务会通过 CADisplayLink等机制通知 App,App主线程开始在 CPU中计算显示内容,比如视图的创建.布局计算.图片解码.文本绘制等.随 ...

  7. iOS性能优化-数组、字典便利时间复杂

    上图是几种时间复杂度的关系,性能优化一定程度上是为了降低程序执行效率减低时间复杂度. 如下是几种时间复杂度的实例: O(1) return array[index] == value; 复制代码 O( ...

  8. <转>iOS性能优化:Instruments使用实战

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

  9. iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码

    最近接了个小任务,和公司的iOS小伙伴们分享下instruments的具体使用,于是有了这篇博客...性能优化是一个很大的话题,这里讨论的主要是内存泄露部分. 一. 一些相关概念 很多人应该比较了解这 ...

随机推荐

  1. 树形动态规划 fjutoj-2131 第四集,聚集城市

    第四集,聚集城市 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld   Problem Description 在小A ...

  2. 10 UA池和代理池

    在Scrapy中,引擎和下载器之间有一个组件,叫下载中间件(Downloader Middlewares).因它是介于Scrapy的request/response处理的钩子,所以有2方面作用: (1 ...

  3. 【Redis】基本数据类型

    一.概述 二.String(字符串) 三.List(列表) 四.Hash(字典) 五.Set(集合) 六.Sorted Set(有序集合) 一.概述 Redis目前支持5种数据类型,分别是: Stri ...

  4. virtualbox下最小化安装centos7后上网设置

    在虚拟机中以最小化方式安装centos7,后无法上网,因为centos7默认网卡未激活. 可以设置 文件 /etc/sysconfig/network-scripts/ifcfg-enp0s3 将 O ...

  5. (转)为什么HashMap中链表长度超过8会转换成红黑树

    原博地址:https://blog.csdn.net/xingfei_work/article/details/79637878 HashMap在jdk1.8之后引入了红黑树的概念,表示若桶中链表元素 ...

  6. Spring boot 集成 Druid 数据源

    Druid是阿里开源的一个JDBC应用组件,其中包括三部分: DruidDriver:代理Driver,能够提供基于Filter-Chain模式的插件体系. DruidDataSource:高效可管理 ...

  7. 自荐RedisViewer有情怀的跨平台Redis可视化客户端工具

    # **自荐一个有情怀的跨平台Redis可视化客户端工具——RedisViewer**[转载自 最美分享Coder 2019-09-17 06:31:00](https://www.toutiao.c ...

  8. WAP自助建站平台娃派宣布关闭 感谢建站之路有你的启蒙

    如题所示的这篇文章是我心血来潮在网上搜索到的,写的挺让我感同身受的,不妨先看一下原文吧. 原文 不知是偶然还是"冥冥定数",最后一次访问娃派建站(wap.ai)已有数十月之久了,突 ...

  9. SQLServer的网络协议

    一.总结 1.SQL Server访问协议包括Shared Memory.Named Pipes.TCP/IP.VIA四种,多数应用系统都是通过TCP/IP协议访问数据库.安装数据库后需要启用TCP/ ...

  10. Asp.Net Core2.2 源码阅读系列——控制台日志源码解析

      为了让我们第一时间知道程序的运行状态,Asp.Net Core 添加了默认的日志输出服务.这看起来并没有什么问题,对于开发人员也相当友好,但如果不了解日志输出的细节,也有可能因为错误的日志级别配置 ...