iOS性能优化
1.CPU 对象的创建,销毁 布局计算 文本排版 图片编解码 图像的绘制
2.GPU 纹理的渲染
显示流程
CPU 计算并提交给 GPU 渲染之后放到 帧缓存 读取到 视频控制器 显示到 屏幕
iOS 使用双缓存区机制
屏幕成像原理
1、由一帧画面形成 发出 VSync 和 HSync信号
卡顿的原因
CPU + GPU VSync信号 进行显示 16ms 既60帧
当 CPU + GPU 时间大于 VSync时间就会造成从 掉帧
卡顿优化---CPU
1.尽量使用轻量级的对象 如不用事件处理考虑用layer代替UIView
2.不用频繁的调整UIview相关布局属性
3.尽量提前计算好属性 频繁更改的要统一进行赋值
4.图片的size最好和ImageView一致
5.控制一下线程的最大并发数量 把耗时操作放到子线程(文本计算、绘制,图片编解码 子线程解码)
卡顿优化--GPU
1.尽量减少视图的数量和层次
2.尽量避免短时间内大量图片的显示 尽可能合成一张
3.GPU能处理的最大纹理尺寸是4096*4096,大于这个尺寸,会让CPU去处理
4.减少半透明视图 不透明设置opaque为YES
5.尽量避免离屏渲染
离屏渲染 在当前屏幕缓冲区外新开辟一个缓冲区进行渲染操作
需要创建新的缓冲区 发生了上下文的切换
触发条件 光栅化
layer.shouldRasterize = YES layer.mask
阴影 如果设置了阴影路径不会触发
圆角 maskToBounds 和圆角一起设置
卡顿检测
可以添加Observer到主线程RunLoop , 监听Runloop的状态切换 ,以达到监控卡顿的目的 LXDAppFluecyMonitor
耗电优化
1.CPU处理 降低CPU GPU功耗 少用定时器 优化I/O操作 大量数据是使用IOAPi 数据库比较大,建议使用数据库(SQLite CoreData)
2.网络 减少,压缩网络数据 protoBuf 多量请求结果是相同的,尽量使用缓存 使用断点续传 网络不可用 取消网络请求
tips Proxy->Throttling Settings 设置弱网环境
3.定位 CoreLocationManager快速定位 获取位置信息 尽量不要实时使用定位 和尽量降低定位精度
4.图像渲染
APP启动优化
冷启动的优化
1.通过添加环境变量 DYLD_PRINT_STATISTICS 设置为1 打印设备信息
Total pre-main time: 961.96 milliseconds (100.0%)
dylib loading time: 775.35 milliseconds (80.6%)
rebase/binding time: 48.36 milliseconds (5.0%)
ObjC setup time: 48.87 milliseconds (5.0%)
initializer time: 89.27 milliseconds (9.2%)
slowest intializers :
libSystem.B.dylib : 9.37 milliseconds (0.9%)
RevealServer : 26.34 milliseconds (2.7%)
CommaUser : 33.46 milliseconds (3.4%)
2.DYLD_PRINT_STATISTICS_DETAILS = 1 400ms
total time: 1.7 seconds (100.0%)
total images loaded: 405 (350 from dyld shared cache)
total segments mapped: 189, into 9340 pages with 952 pages pre-fetched
total images loading time: 1.4 seconds (80.2%)
total load time in ObjC: 44.96 milliseconds (2.5%)
total debugger pause time: 647.29 milliseconds (36.2%)
total dtrace DOF registration time: 0.08 milliseconds (0.0%)
total rebase fixups: 317,784
total rebase fixups time: 45.38 milliseconds (2.5%)
total binding fixups: 477,919
total binding fixups time: 171.93 milliseconds (9.6%)
total weak binding fixups time: 1.42 milliseconds (0.0%)
total redo shared cached bindings time: 174.38 milliseconds (9.7%)
total bindings lazily fixed up: 0 of 0
total time in initializers and ObjC +load: 88.91 milliseconds (4.9%)
libSystem.B.dylib : 9.51 milliseconds (0.5%)
libBacktraceRecording.dylib : 3.23 milliseconds (0.1%)
libMainThreadChecker.dylib : 12.43 milliseconds (0.6%)
libViewDebuggerSupport.dylib : 5.06 milliseconds (0.2%)
libswiftCore.dylib : 6.52 milliseconds (0.3%)
RevealServer : 23.94 milliseconds (1.3%)
RxCocoa : 3.34 milliseconds (0.1%)
CommaUser : 31.86 milliseconds (1.7%)
total symbol trie searches: 1209208
total symbol table binary searches: 0
total images defining weak symbols: 33
total images using weak symbols: 98
冷启动阶段
1.dyld main之前 Apple动态链接器 用来装载Mach-O可执行文件
2.runtime runtime对可执行文件进行解析 load_images装载类和分类 进行OBjc结构的初始化 调用C++静态初始化和_attribute(constructor)修饰的函数
3.main main init之后
APP启动由dyld主导 将可执行文件加载到内存 顺便加载所有依赖的动态库 并由runtime负责加载成objc定义的结构体 然后dyld会调用main函数
优化方案
1.dyld 减少,合并动态库 减少类和分类的数量 减少选择器的数量 减少C++虚函数 Swift尽量使用结构体
2.Runtime 减少load方法 尽量使用dispath_one 和initialize替换
3、main 尽量延迟一些操作,首屏优先加载
安装包瘦身
IPA 由可执行文件和资源文件组成
1.资源 使用无损压缩 去除无用资源
2.可执行文化瘦身 Strip Linked Product、Make String Read_Only、Symbols Hidden by Default
去掉异常支持 Enable C++ Exceptions、Enable Objectiv Expections设置为NO,Other C Flags 添加 -fno-exceptions
3.利用AppCode 检测未使用的代码
4.使用LLVM插件
5.LinkMap 设置为Yes 分析代码等所占用的字节 Github linkmap 解析器
网友评论