美文网首页
iOS-优化

iOS-优化

作者: 李永开 | 来源:发表于2019-02-23 16:38 被阅读0次

    一.画面卡顿优化

    知识铺垫:
    • 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检测卡顿的产生

    相关文章

      网友评论

          本文标题:iOS-优化

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