WWDC2018 session 220

本文深入探讨AutoLayout的工作原理,包括约束如何转化为方程式,并重点介绍了iOS12中的性能改进措施。此外,还提供了避免约束流失及提高AutoLayout效率的实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的一些总结。在写总结时我并非按照视频中介绍的顺序来写的,且有一部分感觉不是很重要的也没有写。大家在阅读时,如果有任何问题,欢迎大家指正。

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值