阿里、字節(jié):一套高效的iOS面試題之視圖&圖形

本篇我們來講一下 阿里勃痴、字節(jié):一套高效的iOS面試題 中的視圖&圖形相關的問題.

iOSInterviewQuestionsAlbumCover.jpeg.jpg

視圖&圖像相關

主要問題列表如下:

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

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

AutoLayout的原理

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

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

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

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

性能如何?

下面是WWDC2018 High Performance Auto Layout中對比的iOS12和iOS11下分別使用自動布局的性能對比現(xiàn)場.

image

經(jīng)過實驗得出如下圖標結論:

image

iOS12之前咆瘟,視圖嵌套的數(shù)量對性能的影響是呈指數(shù)級增長的嚼隘,而iOS12優(yōu)化之后對性能的影響是線性增長,對性能消耗不大袒餐。

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

2.UIView & CALayer的區(qū)別

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

3.事件響應鏈

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

iOS觸摸事件全家桶

4. drawrect & layoutsubviews調(diào)用時機

layoutSubviews:(相當于layoutSubviews()函數(shù))在以下情況下會被調(diào)用:

  1. init初始化不會觸發(fā)layoutSubviews飞蛹。
  2. addSubview會觸發(fā)layoutSubviews谤狡。
  3. 設置view的Frame會觸發(fā)layoutSubviews (frame發(fā)生變化觸發(fā))。
  4. 滾動一個UIScrollView會觸發(fā)layoutSubviews卧檐。
  5. 旋轉(zhuǎn)Screen會觸發(fā)父UIView上的layoutSubviews事件墓懂。
  6. 改變一個UIView大小的時候也會觸發(fā)父UIView上的layoutSubviews事件。
  7. 直接調(diào)用setLayoutSubviews霉囚。

drawrect:(drawrect()函數(shù))在以下情況下會被調(diào)用:

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

知識點擴充: 當我們操作drawRect方法的時候?qū)嶋H是在操作內(nèi)存中存放視圖的backingStore區(qū)域,用于后續(xù)圖形的渲染操作,如果不理解可以看下UIView的渲染過程.

5.UI的刷新原理

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

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

  • view的緩沖區(qū)創(chuàng)建
  • view內(nèi)容的繪制(如果重寫了 drawRect)
  • 接收和處理系統(tǒng)的觸摸事件

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

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

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

6.隱式動畫 & 顯示動畫區(qū)別

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

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

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

7.imageName&imageWithContentsOfFile區(qū)別

區(qū)別 UIView imageWithContentsOfFile
不同點 會圖片緩存到內(nèi)存中 無緩存

8.什么是離屏渲染

image

iOS離屏渲染的深入研究

9.多個相同的圖片盈罐,會重復加載嗎

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

10.圖片是什么時候解碼的榜跌,如何優(yōu)化

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

如何優(yōu)化

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

CGImageSource開頭的哪些,根據(jù)合理利用時機和操作系統(tǒng)資源調(diào)整出一套緩存小加載快的庫.

參考PINRemoteImage或者YYWebImage開源

11.圖片渲染怎么優(yōu)化

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

iOS開發(fā)-視圖渲染與性能優(yōu)化

12.如果GPU的刷新率超過了iOS屏幕60Hz刷新率是什么現(xiàn)象,怎么解決

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

解決辦法只能用xcode自帶工具檢測,看渲染過程哪里可以優(yōu)化.

總結

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

收錄:原文地址

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盅粪,一起剝皮案震驚了整個濱河市钓葫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌票顾,老刑警劉巖瓤逼,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異库物,居然都是意外死亡霸旗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門戚揭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诱告,“玉大人,你說我怎么就攤上這事民晒【樱” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵潜必,是天一觀的道長靴姿。 經(jīng)常有香客問我,道長磁滚,這世上最難降的妖魔是什么佛吓? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮垂攘,結果婚禮上维雇,老公的妹妹穿的比我還像新娘。我一直安慰自己晒他,他們只是感情好吱型,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陨仅,像睡著了一般津滞。 火紅的嫁衣襯著肌膚如雪铝侵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天触徐,我揣著相機與錄音咪鲜,去河邊找鬼。 笑死锌介,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的猾警。 我是一名探鬼主播孔祸,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼发皿!你這毒婦竟也來了崔慧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤穴墅,失蹤者是張志新(化名)和其女友劉穎惶室,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玄货,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡皇钞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了松捉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夹界。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隘世,靈堂內(nèi)的尸體忽然破棺而出可柿,到底是詐尸還是另有隱情,我是刑警寧澤丙者,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布复斥,位于F島的核電站,受9級特大地震影響械媒,放射性物質(zhì)發(fā)生泄漏目锭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一纷捞、第九天 我趴在偏房一處隱蔽的房頂上張望侣集。 院中可真熱鬧,春花似錦兰绣、人聲如沸世分。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臭埋。三九已至踪央,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓢阴,已是汗流浹背畅蹂。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荣恐,地道東北人液斜。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像叠穆,于是被迫代替她去往敵國和親少漆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容