美文网首页
iOS性能优化

iOS性能优化

作者: 马上就来 | 来源:发表于2019-07-09 00:36 被阅读0次

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 解析器

相关文章

网友评论

      本文标题:iOS性能优化

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