2020 最新iOS面試題之視圖&圖形(附答案) 前言 總結 文末推薦

前言

本篇我們來講一下 【iOS面試題的視圖&圖形】相關的問題.

視圖&圖像相關

主要問題列表如下:

  1. AutoLayout的原理,性能如何
  2. UIView & CALayer的區別
  3. 事件響應鏈
  4. drawrect & layoutsubviews調用時機
  5. UI的刷新原理
  6. 隱式動畫 & 顯示動畫區別
  7. 什麼是離屏渲染
  8. imageName&imageWithContentsOfFile區別
  9. 多個相同的圖片,會重複加載嗎
  10. 圖片是什麼時候解碼的,如何優化
  11. 圖片渲染怎麼優化
  12. 如果GPU的刷新率超過了iOS屏幕60Hz刷新率是什麼現象,怎麼解決

1.AutoLayout的原理,性能如何?

AutoLayout的原理

來歷 一般大家都會認爲Auto Layout這個東西是蘋果自己搞出來的,其實不然,早在1997年Alan Borning, Kim Marriott, Peter Stuckey等人就發佈了《Solving Linear Arithmetic Constraints for User Interface Applications》論文(論文地址:http://constraints.cs.washington.edu/solvers/uist97.html)提出了在解決佈局問題的Cassowary constraint-solving算法實現,並且將代碼發佈在他們搭建的Cassowary網站上http://constraints.cs.washington.edu/cassowary/。後來更多開發者用各種語言來寫Cassowary,比如說pybee用python寫的https://github.com/pybee/cassowary。自從它發佈以來JavaScript,.NET,JAVA,Smalltall和C++都有相應的庫。2011年蘋果將這個算法運用到了自家的佈局引擎中,美其名曰Auto Layout。

論文下載鏈接比較慢,我下載了一份Cassowary原文放到了我的博客 大家可以自由下載.

AutoLayout的原理就是用Cassowary算法來將佈局問題抽象成線性不等式,並分解成多個位置間的約束
因爲多了計算視圖大小frame的過程,所以性能肯定沒有指定Frame座標要快.

詳細的原理以及高階原理請參考戴銘老師的文章 戴銘老師寫的 深入剖析Auto Layout,分析iOS各版本新增特性

性能如何?

下面是WWDC2018 High Performance Auto Layout中對比的iOS12和iOS11下分別使用自動佈局的性能對比現場.

經過實驗得出如下圖標結論:

iOS12之前,視圖嵌套的數量對性能的影響是呈指數級增長的,而iOS12優化之後對性能的影響是線性增長,對性能消耗不大。

無論如何優化也肯定不如CGRectFrame那樣的設置更加直接,性能更好.

2.UIView & CALayer的區別

區別 UIView CALayer
繼承父類 UIView:UIResponder:NSObject CALayer:NSObject
用途 可以處理觸摸事件 不處理用戶的交互,不參與響應事件傳遞
兩者關係 有一個CALayer成員變量 eg: view.layer 是UIView的成員變量
分工 處理交互層事件幷包裝各種圖形的簡單設置 底層渲染圖形,支持動畫

3.事件響應鏈

下面這篇文章我已經在前幾篇將runloop的時候提了不止一次,前列建議閱讀,快手的同事大部分都以這個理解爲標準

iOS觸摸事件全家桶

4. drawrect & layoutsubviews調用時機

layoutSubviews:(相當於layoutSubviews()函數)在以下情況下會被調用:

  1. init初始化不會觸發layoutSubviews。
  2. addSubview會觸發layoutSubviews。
  3. 設置view的Frame會觸發layoutSubviews (frame發生變化觸發)。
  4. 滾動一個UIScrollView會觸發layoutSubviews。
  5. 旋轉Screen會觸發父UIView上的layoutSubviews事件。
  6. 改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件。
  7. 直接調用setLayoutSubviews。

drawrect:(drawrect()函數)在以下情況下會被調用:

  1. drawrect:是在UIViewController的loadView:ViewDidLoad:方法之後調用.
  2. 當我們調用[UIFont的 sizeToFit]後,會觸發系統自動調用drawRect:
  3. 當設置UIView的contentMode或者Frame後會立即觸發觸發系統調用drawRect:
  4. 直接調用setNeedsDisplay設置標記 或setNeedsDisplayInRect:的時候會觸發drawRect:

知識點擴充: 當我們操作drawRect方法的時候實際是在操作內存中存放視圖的backingStore區域,用於後續圖形的渲染操作,如果不理解可以看下UIView的渲染過程.

5.UI的刷新原理

這個問題我不知道問的是不是iOS離屏渲染過程,我來簡單的回到一下這個吧

iOS 的MainRunloop 是一個60fps 的回調,也就是說16.7ms(毫秒)會繪製一次屏幕在這過程中要完成以下的工作:

  • view的緩衝區創建
  • view內容的繪製(如果重寫了 drawRect)
  • 接收和處理系統的觸摸事件

我們看到的UI圖形實際上是CPU和GPU不斷配合工作的結果.經過UIView的渲染過程 後我們的UI會不間斷的接收系統圖給我們的事件.

由於主線程的runloop 一直在回調,我們的UI就得到了刷新的窗口,是渲染還是處理事件都是因爲runloop不斷工作的結果.前幾篇我們學過 main線程的runloop默認是啓動的.因爲我們響應交互.

不知道我這樣回答是否滿足這個問題的答案.如果回答的不對煩請下方評論區留言 告知我將持續改進.

6.隱式動畫 & 顯示動畫區別

隱式動畫一直存在 如需關閉需設置
顯式動畫是不存在,如需顯式 要開啓

只需要觀察動畫執行完成的結果 比如: 一個簡單UIView的frame移動 如果從A點移動到B點 移動完成 回到原始位置就是隱式動畫

Core Animation 是顯式動畫.因爲它既可以直接對其layer屬性做動畫,也可以覆蓋默認的圖層行爲.

7.imageName&imageWithContentsOfFile區別

區別 UIView imageWithContentsOfFile
不同點 會圖片緩存到內存中 無緩存

8.什麼是離屏渲染

iOS離屏渲染的深入研究

9.多個相同的圖片,會重複加載嗎

不會,GPU有 像素點緩存的mask.

10.圖片是什麼時候解碼的,如何優化

是加載到內存中,從UIImge->CGImage->CGImageSourceCreateWithData(data) 創建ImageSource變成bitmap位圖,這些工作都是CoreAnimation在圖片被加載到內存中存在在backingStore裏,送給GPU流水線處理之前被解碼.

如何優化

自己手動操作圖片的編碼API

CGImageSource開頭的哪些,根據合理利用時機和操作系統資源調整出一套緩存小加載快的庫.

參考PINRemoteImage或者YYWebImage開源

11.圖片渲染怎麼優化

可以從陰影,圓角入手.幀率,電量,圖片的鋸齒等等.

iOS開發-視圖渲染與性能優化

12.如果GPU的刷新率超過了iOS屏幕60Hz刷新率是什麼現象,怎麼解決

現象是 圖形清晰,場景逼真,但是一般arm芯片的GPU 刷新超過60Hz一定會超級費電,手機發熱導致降頻.FPS降低,因爲低能耗電量不足,無法支持GPU高刷新率

解決辦法只能用xcode自帶工具檢測,看渲染過程哪裏可以優化.

總結

簡單回答了一些圖形相關的問題,大部分都是iOS離屏渲染,這個地方大家要認真學習.很多資料看起來比較耗時.

文末推薦

收錄:原文地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章