autolayout与frame的性能比较

autolayout是相对布局,frame是绝对布局,相对于性能frame更好一点,但是review太复杂,编程效率低。相对于来说Masonry或者SnapKit(swift)可读性强,效率高,是个不错的选择。

1.关于AutoLayout

AutoLayout 不只有布局算法 Cassoway,还包含了布局在运行时的生命周期等一整套布局引擎系统,用于统一管理布局的创建、更新和销毁。这一整套布局引擎叫做 Layout Engine,是  AutoLayout 的核心,主导者整个界面布局。

每个视图在得到自己的布局之前,Layout Engine 会将视图、约束、优先级、固定大小通过计算转换成最终的大小和位置,在 Layout Engine 里,每当约束发生变化,就会触发 Deffered Layout Pass, 完成后进入监听约束变化的状态。当再次监听到约束变化,即进入下一轮循环中。

设置约束的 Constant 和 Priority 时也会触发约束变化。Layout Engine 在碰到约束变化后会重新计算布局,获取到布局后调用 superView.setNeedLayout() 然后进入 Deffered Layout Pass, Deffered Layout Pass 的作用主要是容错处理,如果有些视图在更新约束时没有确定或缺失布局声明会在此做容错处理。接下来,Layout Engine 会从上到下调用 layoutSubViews() , 通过 Cassoway 算法计算各个子视图的位置,算出来将子视图的 frame 从 Layout Engine 拷贝出来。

Auto Layout 在 iOS 12 中优化后的性能,已经基本和手写布局一样可以达到性能随着视图嵌套的数量呈线性增长 了。而在此之前的 Auto Layout,视图嵌套的数量对性能的影响是呈指数级增长的。 为什么 iOS 12 以前性能不好呢? 原因是:iOS 12以前,当有约束变化时都会重新创建一个计算引擎 NSISEngier 将约束关系重新加起来,重新计算。涉及到约束关系变多时,新的计算引擎需要重新计算,最终导致计算量指数级增加! Cassoway 算法本身没有问题,问题是iOS 12之前在某些情况下没有用好这个算法。 iOS 12 以后的 AutoLayout 更多的利用了 Cassoway 算法的界面更新策略,使其真正完成了高效的界面线性策略计算,使其和手写布局有了几乎相同的高性能! 

推荐阅读更多精彩内容

  • 1.1 AutoLayout原理 iOS 中视图所需要的布局信息只有两个,分别是 origin/center 和 ...
    Claire_wu阅读 6,265评论 2 13
  • 用简书记录生活确实很方便,那就用简单的文字说说简单的生活吧!今天才是周二就已经感觉到了周末买齐一周蔬菜的好处了,昨...
    颜悦yanyue阅读 398评论 15 4
  • 每年正月十五,是老家赏灯的时候。 跟往年不同,今年没有提前一天回老家,而是在赏灯当天早晨回去。 ...
    雨落月上阅读 53评论 0 5
  • 在澳门最后一晚,葡餐宴。 暖色的灯光,温馨了短暂的用餐时光。柔曼的轻音乐,调和着优雅而淡远的情调。享用时,有人说,...
    adorekala阅读 42评论 0 0
  • 我来问问你 有没有一瞬间会想起我(上) 如果梦分三种 那你一定...
    一车梨子阅读 53评论 1 2