一.画面卡顿优化
知识铺垫:
- cpu执行的阶段
1.Layout阶段:UI布局、文本计算
2.Display阶段:绘制,例如drawRect()方法
3.Prepare:图片编解码得到位图
4.Commit:CoreAnimation对位图进行提交- GPU渲染管线
也叫openGL渲染管线
1.顶点作色对位图进行处理
2.图元装配
3.光栅化
4.片段着色
5.片段处理
6.提交到buffer frame- 视频控制器
1.定时产生VSync信号.
2.从buffer frame 里面拿到帧数据
3.显示器显示
- 画面卡顿其实就是掉帧了.
- 掉帧的原因:画面的形成是由电子枪一行一行扫描出来的.在某一个时间点,系统会给出重头扫描的信号(VSync),这代表上一帧已经显示完了.
如果cup计算+gpu渲染的时间总和超过了两个VSync信号的间隔,由于开启了垂直同步的原因,那么系统就会丢弃掉这一帧,这导致屏幕上的内容还是上一帧的,这样看起来就是画面卡顿了.
优化方案
1.预排版,将布局计算、文本计算放到子线程.
2.文本异步绘制、图片编解码
3.避免离屏渲染.
4.减少视图的层级
二.文本的异步绘制优化
知识铺垫:
1.当我们调用
UIView setNeedsDisplay方法
的时候
2.系统会调用View.layer setNeedsDisplay方法
3.在当前runloop快要结束的时候,调用CALayer display方法
4.判断[layer.delegate responds To @selector(displayLayer:)]方法
5.1.如果返回NO,进入系统绘制流程
5.2.如果返回YES,进入异步绘制入口
- 系统绘制流程
1.创建context
2.判断layer是否有delegate
3.1.如果没有,调用CALayer drawInContext
3.2如果有,调用[layer.delegate drawLayer:inContext:]
,调用[UIView drawRect:]
4.上传context上下文
到GPU- 异步绘制流程
1.判断layer.delegate是否响应displayLayer
2.如果响应,自己绘制bitmap,然后layer.contents = bitmap.
异步绘制详解
1.[YKView setNeedsDisplay]
2.[CAlayer display]
3.因为layer有delegate,所以会由layer的delegate代替系统去绘制位图
4.切换到子线程,进行位图绘制
5.回到主线程,layer.contents = bitmap.
三.性能优化
cpu优化
- 如果没有触摸事件,尽量使用CALayer代替UIView
- 尽量避免频繁修改UIView的属性,例如frame、transform等
- 大量视图的是时候,可以不适用autolayout,手动计算布局
- 图片的size和UIImageView的大小一致,避免cpu进行拉伸的计算
- 控制线程的数量
- 尽量将耗时操作放到子线程
视图优化
- 尽量减少视图数量和图层结构
- 图片异步解码
- 减少透明的视图
- 避免离屏渲染的出现
电量优化
- 尽量少使用定时器
- 尽量不要频繁写入小数据,批量写入比较好
- 如果有大数据写入,可以使用系统提供的dispath_io
- 大量数据,使用数据库
- 如果只是使用一次定位,就设置合适的权限
- 设置合适的定位精度
- 使用完毕,关闭定位
网络优化
- 减少、压缩网络数据
- 可以使用缓存
- dns缓存
- 使用断点续传,避免网络不好带来的重新传输
- 监听网络状态,网络不可用时不发送网络请求.
- 批量传输
启动优化
- dyld 加载各种库,可以合并某些动态库,学习美团延迟某些动态库的加载时机
- 使用runtime初始化Objc,例如加载类方法、加载category,可以减少类和分类的数量
- 进入到main函数,懒加载某些功能,使用的时候再去加载
安装包优化
- 对图片、视频进行无损压缩
- 使用工具去处无用的文件和图片等
性能优化
- 如果有大量的数据,可以使用autoreleasePool
- 使用runloop检测卡顿的产生
网友评论