性能优化.png

    • 性能优化的参考点
      • FPS(重点)
      • 加载时长
    • 基本优化方案
      • 使用ARC管理内存,目前基本都是ARC环境
      • 正确的使用resueIdentier
      • 尽量把views设置为不透明
      • 避免使用复杂的xib文件
      • 不要阻塞主线程
      • 复用和延迟加载Views
      • 缓存方案尽量使用Cache进行处理
      • 正确处理内存警告,有对应的方法,移除缓存,图片等可以重用的资源
      • 重用开销较大的对象
      • 对初始化较慢的对象,比如NSDateFormatter,NSCalender之类的需要在类中添加属性,避免多吃创建带来的开销,或者使用静态变量来实现
      • 避免反复对数据处理加工,需要和服务端分配职责,保持一致的数据结构
      • 在设置背景是,如果可以使用小图构成,尽量使用小图并用UIColor的方法去渲染
      • 优化tableView
        • 正确使用resuidentifier来重用cells
        • 尽量设置所有的view的opaque=YES,包括cell自身
        • 避免渐变,图片缩放
        • 缓存行高
        • 如果cell中的内容来自web,使用异步加载,缓存请求结果
        • 使用showdowPath绘制阴影
        • 减少subviews的数量
        • 使用rowheight,sectionHeaderHeight,sectionFooterHegith来设置固定的高,delegate的方式少用
      • 如何提升tableView流畅度?
        • 主要考虑CPU、GPU层面
          • CPU(对象的创建、销毁、对象属性的调整、布局计算、文本的计算、排版、图片的格式转换和解码、图像的绘制)
            • 1、尽量用轻量级的对象
            • 2、不要频繁的调用UIView的frame,bounds,transform。尽量减少不必要属性修改
            • 3、尽量提前计算好布局,在需要时一次性赋值属性
            • 4、Autolayout比frame消耗更多CPU资源
            • 5、图片的size最好和UIImageView的size保持一致
            • 6、控制一下线程的最大并发数
            • 7、尽量把耗时的操作放在子线程
              • 文本处理
                • 尺寸计算
                • 绘制
              • 图片处理
                • 解码
                • 绘制
          • GPU(纹理的渲染)
            • 尽量避免短时间内大量图片的显示,尽可能的将多张图片合成一张
            • GPU处理的最大纹理4096x4096,超过这个尺寸会占用CPU资源处理
            • 尽量减少视图的数量和层级
            • 减少透明的视图(alpha<1),不透明的设置opaque为YES
            • 尽量避免出现离屏渲染
        • 预排版,提前计算
        • 预渲染,提前绘制
        • 异步绘制
        • 全局并发线程
        • 高效的图片绘制
    • 高级优化方案

      • 1、加速启动时间
      • 2、使用@autoreleasePool
      • 3、选择是否缓存图片
        • imageNamed: 会对图片做缓存
        • imageWithContentsOfFile:仅加载,不会对图片做缓存
      • 4、重用NSDateFormatter
      • 5、光栅化
        • 光栅化是将几何数据经过一些列的变化之后最终转变为像素。从而呈现在显示设备上的过程,光栅化的本质是坐标变换、几何离散化
        • cell.layer.shouldRasterize=YES
    • 离屏渲染

      • 什么是离屏渲染?

        • 定义:在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
        • 消耗性能的原因?
          • 需要创建新的缓冲区
          • 离屏幕渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕切换到离屏。等离屏渲染结束后,将离屏缓冲区的渲染结果显示到屏幕上,又需要上下文切换环境从离屏到当前屏幕渲染
      • 如何检测离屏渲染?

        • instrument
          • core animation
            • 勾选 Color Offscreen-Rendered Yellow
      • 什么操作会触发离屏渲染?

        • 光栅化,layer.shouldRasterize=YES
        • 遮罩,layer.mask
        • 圆角,同时设置layer.masksToBounds=YES,layer.cornerRadius > 0
        • 考虑通过CoreGraphics绘制裁剪的圆角
        • 阴影,layer.shadowXXX,如果设置shadowPath就不会产生离屏渲染
        • 渐变
      • 如何避免离屏渲染?

        • 对应触发的操作进行避免
    • 如何进行代码优化的?

      • Xcode的性能分析工具
        • Analyze
        • Instrument
          • time Profiler
      • 0x8badf00d
        • 看门狗机制,会检测应用的性能,如果超过规定的时间,则会强制终结该应用的进程
    • 日常如何检查内存泄漏

      • Memory Leaks
      • Alloctions
      • Analyse
      • Debug Memory Graph
      • MLeaksFinder
        • 腾讯开源
    • 如何优化App电量

      • 耗电的主要方面

        • CPU处理
        • 定位
        • 网络
        • 图像
      • 优化的途径

        • 尽可能降低CPU、GPU的功耗
        • 尽量少用定时器
        • 优化I/O操作
          • 不要频繁写入小数据,可以批量处理
          • 读写大量数据可以使用GCD
          • 数据量比较大时,建议使用数据库
        • 网络层面优化

          • 减少压缩网络数据
          • 请求返回的数据相同,可以使用NSCache进行缓存
          • 使用断点续传,避免因网络失败后重新下载
          • 网络不可用的时候,不尝试进行网络请求
          • 长时间的网络请求,要提供网络取消操作
          • 采取批量传输
        • 定位层面优化

          • 如果只需要快速确定用户位置,最好用CLLocationManager的requestLocation方法,定位完成后,会自动让定位硬件断电
          • 如果不是导航应用,尽量不要实时更新位置,定位完毕就关闭掉定位服务
          • 尽量降低定位精度,比如尽量不要用精度最高的kCCLocationAccurasyBest
          • 需要后台定位时,尽量设置pausesLocationUpdatesAutomatically为YES,如果用户不太可能移动的时候系统会自动暂停位置更新
          • 尽量不要使用startMonitoringSignificantLocationChanges,优先考虑startMonitoringForRegion:
        • 硬件层面

          • 加速度计,陀螺仪,磁力计
    • facebook启动时间优化

      • 瘦身请求依赖
      • UDP启动请求先行缓存
      • 队列串行化处理启动响应