UI相關
1. UI視圖數(shù)據(jù)源同步
并發(fā)訪問,數(shù)據(jù)同步 (內(nèi)存消耗 )
并發(fā)訪問铛楣,數(shù)據(jù)拷貝
串行訪問(子線程耗時,會有延時)
串行訪問
2. 事件傳遞和視圖響應的機制和流程
UIView和CALayer
QQ20190509-000336@2x
UIView的backgroundcolor是對CALayer里backgroundcolor的包裝弯洗,contents負責顯示內(nèi)容置尔,backing store是一個bitmap的位圖
- UIView為CALayer提供顯示的內(nèi)容趋惨,以及負責處理觸摸等事件孩锡,參與響應鏈
- CALayer負責顯示內(nèi)容contents
相關設計原則:單一職責原則
時間傳遞與視圖響應鏈
// 返回最終響應的視圖
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
-
hitTest內(nèi)部實現(xiàn)邏輯
QQ20190509-002135@2x
// 判斷某一個點擊的位置是否在當前視圖范圍內(nèi)
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
-
事件傳遞流程
QQ20190509-001929@2x
-
事件響應流程
QQ20190509-002604@2x
3. 圖像顯示原理
[圖片上傳失敗...(image-9fc2d1-1557369619472)]
-
CPU工作
QQ20190509-003130@2x
- UI布局酷宵,文本計算
- 繪制 drawrect
- 圖片編解碼
- 提交位圖
-
GPU渲染管線
QQ20190509-003408@2x
UI卡頓、掉幀的原因
QQ20190509-003554@2x
-
滑動優(yōu)化方案
-
CPU
- 對象的創(chuàng)建躬窜、調(diào)整浇垦、銷毀放到子線程
- 預排版(布局計算、文本計算)放到子線程
- 預渲染(文本等異步繪制荣挨、圖片編解碼)放到子線程
-
GPU
- 紋理渲染(避免離屏渲染)
- 試圖混合
-
-
UIView繪制原理
[圖片上傳失敗...(image-88b6af-1557369619472)]
runloop將要結束時調(diào)用CALayer的display方法
系統(tǒng)繪制流程
QQ20190509-004655@2x
- 實現(xiàn)異步繪制
-[layer.delegate displayLayer:]
1. 代理負責生成對應的bitmap
2. 設置該bitmap作為layer.contents屬性的值
QQ20190509-005146@2x
離屏渲染
On-n-Screen Rendering
意為當前屏幕渲染男韧,指的是GPU的渲染操作是在當前用于顯示的屏幕緩沖區(qū)中進行Off-n-Screen Rendering
意為離屏渲染,指的是GPU的渲染操作是在當前緩沖區(qū)以外新開辟一個緩沖區(qū)進行渲染操作-
觸發(fā)場景
- 圓角(當和maskToBounds同時使用時)
- 圖層蒙版
- 陰影
- 光柵化
簡書吞圖默垄,其他鏈接