1催训、UITableView相關(guān)
(1) 重用機制
cell = [tableview dequeueReusableCellWithIdentifier:@"identifer"];
利用重用標(biāo)識符宗收,查看重用池中是否存在可復(fù)用的視圖,如果沒有采驻,cell則返回nil匈勋,需要手動創(chuàng)建視圖對象。
(2) 數(shù)據(jù)源同步
并發(fā)數(shù)據(jù)訪問和串行隊列兩種解決方案颓影。
2、事件傳遞&視圖響應(yīng)鏈
(1) UIView 和 CALayer
UIView為CALayer提供顯示內(nèi)容碎浇,以及負(fù)責(zé)處理觸摸事件等璃俗,參與響應(yīng)鏈。
CALayer只負(fù)責(zé)顯示contents內(nèi)容城豁。
這樣設(shè)計的原因是遵循:單一職責(zé)原則。
(2)事件傳遞
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
哪個視圖響應(yīng)這個事件雳旅,就返回哪個視圖。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
用于判斷某一個點擊的位置抵拘,是否在這個視圖范圍內(nèi)型豁,如果在就返回yes,不在就返回no。
(3)視圖事件響應(yīng)
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
4迎变、卡頓&掉幀
(1)UI卡頓掉幀的原因
Vsgnc 16·7ms,CPU和GPU必須在16.7ms的時間內(nèi)驼侠,完成下一幀視圖的合成泵喘,否則就會出現(xiàn)卡頓或掉幀的現(xiàn)象。
(2)滑動優(yōu)化方案
CPU優(yōu)化
1纪铺、對象的創(chuàng)建、調(diào)整突诬、銷毀盡量放到子線程去做
2芜繁、預(yù)排版(布局計算丶文本計算)
3、預(yù)渲染(文本等異步繪制丶圖片編解碼等)GPU優(yōu)化
1骏令、減少視圖層級和視圖混合。
2周拐、觸發(fā)離屏渲染凰兑,比如CALayer繪制圓角等,都會導(dǎo)致GPU耗時過長吏够。盡量減少離屏渲染滩报,利用好GPU的異步繪制機制播急。
5、繪制原理&異步繪制
(1)UIView的繪制原理
當(dāng)調(diào)用 [UIview setNeedsDisplay] 時惭笑,不會立即重新繪制視圖生真,而是在某一個時機繪制視圖捺宗。
6、離屏渲染
什么是離屏渲染蚜厉?
離屏渲染,指GPU的渲染操作是在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進行渲染操作术瓮。
什么是在屏渲染贰健?
在屏渲染,指GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進行伶椿。
何時會觸發(fā)離屏渲染脊另?
1、當(dāng)設(shè)置圓角(當(dāng)和maskToBounds一起使用時)觸發(fā)偎痛!
2、圖層蒙版
3枚赡、陰影
4靖榕、光柵化
為何要避免?
在觸發(fā)離屏渲染的時候茁计,會增加GPU的工作量谓松〖粒可能會導(dǎo)致GPU和CPU的總耗時超過16.7ms,造成卡頓和掉幀优质。