WWDC2018 session 220

High Performance Auto Layout

本视频主要是介绍了在使用Auto Layout中的一些注意事项,以及Auto Layout的原理,和iOS 12中对Auto Layout性能的优化。

Auto Layout原理

Auto Layout需要依赖一个个的约束,最终UIView根据这些约束确定自身的位置,宽高,完成布局和渲染。因此,理解Auto Layout的原理,其实就是理解约束的本质,以及约束是如何工作的。

Auto Layout的原理视频中已经简单介绍了。实际上,我们所创建的约束,最终转化成了一个个的一次方程式,如果有多个约束,可能就转化成了多元一次方程组。计算约束的过程,就是解多元一次方程组的过程,解出的值,就是UIView的位置或者宽高信息。计算多元一次方程组的过程是Auto Layout 引擎来负责的。官方给了一张图来表示UIView、约束、引擎以及其他参与者之间的关系:
在这里插入图片描述
UIView增加约束,实际上就是增加了一个方程式,方程式的解由Auto Layout Enginee负责计算,计算出的值即Variable就是UIView的位置和宽高信息。

在视频中还介绍了,如果一个view中有多个相互独立的子view使用了Auto Layout,那么其性能消耗是随着子view的个数而线性增加的,原因就是因为计算多元一次方程组时,多一元,其计算复杂度是线性增加的。子视图个数和消耗性能之间的关系如图:
在这里插入图片描述

iOS 12 improvements

最开始也说了,在iOS 12中,苹果针对Auto Layout做了性能优化。在视频开始处,苹果也给出了一个视频,同样的代码分别在iOS 11上运行和在iOS 12上运行的效果,可以明显的看出iOS 12上运行更加流畅。除此之外,苹果也给出了一张图,对比了Auto Layout在iOS 11和iOS 12上的性能消耗:
在这里插入图片描述
灰色的代表iOS 11,蓝色的代表iOS 12。

使用Auto Layout时,通常会重写updateConstraints()方法,也就是更新约束的方法。一种常见的错误写法如下:
在这里插入图片描述
在解释为什么这样写问题之前,先了解一下渲染循环。

渲染循环(Render Loop)

我们知道iOS设备每秒钟刷新60次,渲染循环的作用是确保UI视图在每秒的所有帧中都显示正常。为了做到这一点,Render Loop每秒钟运行120次,频率非常高。渲染循环分为三个步骤:

  1. 更新约束,从子视图向外层逐级更新约束
  2. Layout调整,从父视图到子视图,逐级视图获得自身的layout
  3. 渲染过程,同样从父视图到子视图,渲染显示视图
    官方给了一张渲染循环的示例图:
    在这里插入图片描述
    实际上,上面提到的updateConstratins()方法就是渲染循环中的第一步,也就是更新约束。在上面介绍的三步中,每一步苹果都提供了对应的方法,而且不止一个方法,来看一下:
    在这里插入图片描述
    现在来说一下上面提到的代码为什么有问题。因为已经介绍过,渲染循环每秒钟运行120次,因此updateConstraints()方法每秒钟也要运行120次,而在updateConstraints()中每次都要移除所有的约束,然后重新添加一遍,这明显是没必要的。其实解决方法也非常简单,就是经常用到的懒加载的思想,修改过的代码如下:
    在这里插入图片描述
    上面提到的问题其实有一个专业术语名称:约束流失。约束流失,简单来说就是约束本身并没有改变,但是由于代码的问题,删除了之前的所有约束,又重新添加了约束。由于删除约束,重新添加约束是浪费性能,且在约束不变的情况下,重新添加约束没有必要,因此在代码中要避免约束流失。

更高效使用Auto Layout

在视频中介绍了一些更高效使用Auto Layout的方法,这里介绍一下。

避免约束流失的几个小tip

这里是使用了常见的feed流来举例,可以简单理解为朋友圈,以该例给出了几个避免约束流失的小tip:

  1. 避免移除全部的约束
  2. 一些通用公用的布局约束,一次性添加,且添加之后尽量不要再修改
  3. 只改变那些需要改变的约束,不要改变哪些不需要改变的约束
  4. 多使用隐藏视图的方式,而不是移除约束

根据上面的介绍,这里的四点也易于理解,不再做过多的解释。

减少systemLayoutSizeFitting()

systemLayoutSizeFitting()的作用是根据控件的Layout自动的帮助我们计算约束,但是这整个过程是非常耗性能的。因此在代码中,要尽量减少systemLayoutSizeFitting()的使用。

使用Instrument检测不合理的Auto Layout

新版本的Xcode在Instrument中增加了一个新的工具 Instrument for Layout,使用该工具可以检测出哪个控件发生了约束流失,以及某一时刻CPU的使用情况。需要注意的是,该工具在Xcode 10上还未上线,可能还需要再等一段时间。视频中给出了使用该工具的示例图:
在这里插入图片描述

避免不可满足约束

所谓不可满足约束,举例来说,给一个控件添加了约束宽度是50,同时宽度又应该是200时,这种情况是不可能完成的,这就是不可满足约束。出现这样的代码时,即使约束不可完成,但是Auto Layout引擎不得不计算出一个结果,这种情况下就会破坏一个约束以来满足。破坏约束时,会发送一个详细的日志到Xcode。不可满足约束是不合理的,而且可能会引起一些其他的问题,因此Xcode debug log中出现破坏约束时,需要找到破坏约束的地方并修改。

总结

以上就是看session 202的一些总结。在写总结时我并非按照视频中介绍的顺序来写的,且有一部分感觉不是很重要的也没有写。大家在阅读时,如果有任何问题,欢迎大家指正。

发布了71 篇原创文章 · 获赞 34 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/TuGeLe/article/details/82748488