UI視圖 - 圖像顯現(xiàn)原理和滑動優(yōu)化
UI視圖 - UI事件傳遞及視圖響應鏈
UI視圖 - UITableView重用池機制及優(yōu)化
UI視圖-屏幕適配
圖像顯現(xiàn)原理
CPU - GPU - 幀緩沖區(qū) - 屏幕
1.VSync信號(16.7ms顯示一幀畫面)
2.VSync信號結(jié)果放入幀緩沖區(qū)
3.提取幀緩沖區(qū)內(nèi)容,顯示到顯示器上
下面看下在16.7ms內(nèi)計算機做了什么
CPU - 提交位圖 - GPU
"***我們可以分別對CPU和GPU做滑動優(yōu)化***"
***CPU做了什么 - UI布局,文本計算,繪制,圖片編解碼***
可做的優(yōu)化
- 在子線程中進行對象的創(chuàng)建,調(diào)整和銷毀
-在子線程中預排版(布局計算,文本計算)
-讓主線程有更多的時間去響應用戶的交互
-預渲染(文本等異步繪制,圖片編解碼等)
***GPU做了什么 - 圖層合成,紋理渲染***
可做的優(yōu)化
-紋理渲染方面的優(yōu)化:避免離屏渲染
-避免設置視圖的圓角屬性(必須同時maskToBounds為YES才會觸發(fā))
-避免設置視圖的圖層蒙版
-避免設置陰影
-避免設置光柵化
-圖層合成方面的優(yōu)化:減少視圖層級復雜度
UIView的繪制原理
[view setNeedsDisplay]并不是立刻繪制,而是進入下面流程
1. [layer setNeedsDisplay]
2. 判斷l(xiāng)ayer的代理方法displayLayer是否實現(xiàn)
3. 實現(xiàn)了,進行異步繪制
4. 未實現(xiàn),進行系統(tǒng)調(diào)用
"異步繪制"
代理通過CGBitmapContextCreat方法創(chuàng)建位圖上下文
通過CoreGraphic的相關API,可以做當前UI控件的一些繪制工作
通過CGBitmapContextCreatImage方法,根據(jù)所繪制的上下文,生成一張CGImage圖片
回到主隊列中,提交這個位圖
設置給CALayer的contents屬性
"系統(tǒng)調(diào)用"
CALayer內(nèi)部創(chuàng)建CGContextRef,CALayer上傳對應的context給GPU
它有代理 - 調(diào)用代理方法,做當前視圖的繪制工作,[UIView drawRect],這一步可以通過堆棧中的上下文取出context
沒有代理 - [CALayer drawInContext]
UIView和CALayer
UIView只負責事件傳遞及視圖響應鏈的機制
CALayer只負責內(nèi)容contents的顯示
UI事件傳遞
主要方法
hitTest
pointInside
當點擊了屏幕,點擊事件傳遞給UIApplication - UIWindow -在UIWindow里面會判斷hitTest,來返回最終的響應視圖
內(nèi)部實現(xiàn)
1.先判斷是否可交互,是否隱藏以及是否透明
2.調(diào)用pointInside,判斷當前點擊的點是否在UIWindow范圍內(nèi)
是的話,倒序遍歷UIWindow的子視圖,來查找最終響應事件的視圖
不是的話,返回UIWindow
UI視圖響應鏈
主要方法
touchesBegan
touchesMoved
touchesEnded
首先找到當前響應的view看它能否處理這個事件
view - 父視圖 - UIApplicationDelegate - 事件被忽略