- 性能优化的参考点
- 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
- 尽量避免出现离屏渲染
- CPU(对象的创建、销毁、对象属性的调整、布局计算、文本的计算、排版、图片的格式转换和解码、图像的绘制)
- 预排版,提前计算
- 预渲染,提前绘制
- 异步绘制
- 全局并发线程
- 高效的图片绘制
- 主要考虑CPU、GPU层面
高级优化方案
- 1、加速启动时间
- 2、使用@autoreleasePool
- 3、选择是否缓存图片
- imageNamed: 会对图片做缓存
- imageWithContentsOfFile:仅加载,不会对图片做缓存
- 4、重用NSDateFormatter
- 5、光栅化
- 光栅化是将几何数据经过一些列的变化之后最终转变为像素。从而呈现在显示设备上的过程,光栅化的本质是坐标变换、几何离散化
- cell.layer.shouldRasterize=YES
离屏渲染
什么是离屏渲染?
- 定义:在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
- 消耗性能的原因?
- 需要创建新的缓冲区
- 离屏幕渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕切换到离屏。等离屏渲染结束后,将离屏缓冲区的渲染结果显示到屏幕上,又需要上下文切换环境从离屏到当前屏幕渲染
如何检测离屏渲染?
- instrument
- core animation
- 勾选 Color Offscreen-Rendered Yellow
- core animation
- instrument
什么操作会触发离屏渲染?
- 光栅化,layer.shouldRasterize=YES
- 遮罩,layer.mask
- 圆角,同时设置layer.masksToBounds=YES,layer.cornerRadius > 0
- 考虑通过CoreGraphics绘制裁剪的圆角
- 阴影,layer.shadowXXX,如果设置shadowPath就不会产生离屏渲染
- 渐变
如何避免离屏渲染?
- 对应触发的操作进行避免
如何进行代码优化的?
- Xcode的性能分析工具
- Analyze
- Instrument
- time Profiler
- 0x8badf00d
- 看门狗机制,会检测应用的性能,如果超过规定的时间,则会强制终结该应用的进程
- Xcode的性能分析工具
日常如何检查内存泄漏
- 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启动请求先行缓存
- 队列串行化处理启动响应