無標題

iOS 12 improvement

在開頭(2:25),Apple 直接使用3rd party benchmark 來展現iOS 11 與iOS 12 的Auto layout performance 差異,這真是一個大膽又令所有工程師們有共鳴的方式 🤣

無標題

Internals and intuition

無標題

無標題

無標題

透過上圖,我們可以看到每次都重新新增constraints 是一件昂貴的是,他必須從update constraints 到layout 到display 重新來過一次。

無標題

因此,一次性的加上constraints 是更有效率的方式,透過interface builder 來make 一個新的instance 即是這個方式。

無標題

View 被Window 持有,Window 同時有一個Engine ,來計算Auto Layout 的大小事,而View 又會擁有Constraint,每當一個Constraint 被加到View 當中,Engine 就會多一條方程式要計算,計算完的答案就是Variable,再賦予回View 再賦予回View 上面的某個值。

無標題

在這一小段中提到,其實整個Auto Layout 的過程並不複雜,計算的數學方程式也跟你手寫Frame Layout 是相同的,問題可能出在誤用了update constarint 的時機,導致大量不必要的重新計算,造成效能低落。

無標題

接下來提到,我們可能經常共用同一個View 來實現兩種不同的可能,導致這種相當複雜的Constaint,應該將他們分開來當成兩種狀況分別實作,會有更好的效能,也更容易了解。

無標題

除此之外,Apple 列出Auto Layout 的幾項功能,來探討他們的Cost:

  • Inequality
  • NSLayoutConstraint set constant
  • Priority

其中前兩項,Apple 表示他們的Cost 微乎其微,但是Priority 就不是了。

Apple 在這一段落中,對於效能的小結論:

  • Don’t churn(別做無謂的計算,能算一次就算一次就好,使用xib 就是一途)
  • Basic algebra(其實就是一堆方程式,跟你自己寫是一樣的)
  • Engine is a layout cache and tracker
  • You pay for why you use(當你用了越複雜的UI,你的代價就越高)

Building efficient layouts

這一小節,Apple 展示了一個常見的Layout 方式,並透過Instrument 的新功能來trace hotspot

無標題

當中,直接真的constraints 一些地方進行改善,即可獲得效能優化(注意,是在iOS 11 就優化,iOS 12 則更好 ),優化的重點:

Constraint Churn

  • 避免移除所有的constraints
  • 如果constraints 有動態改變的狀況,可以將他們改成static constraints,透過置換的方式來實作
  • 只改變需要改變的constraints
  • 透過hidden 屬性來隱藏一個view,而不是將他們移除

無標題

另外提到systemLayoutSizeFitting(_ targetSize:)是昂貴的,應小心使用。

心得

從我學習Auto Layout 以來,並沒有真正透徹的了解他背後的原理及他可能影響的效能瓶頸會在哪邊,透過這場sessiion 算是對Auto Layout 的原理有了全新的認識,也知道了一些Do & Don’t,在未來的應用上也可以透過新版的Instrument 來協助測量hotspot,相信未來的優化之路也會更加容易。