UIView與CALayer
UIView為CALayer提供內(nèi)容烦绳,一級負責處理觸摸等時間卖毁,參與響應(yīng)鏈
CALayer負責顯示內(nèi)容contents
時間傳遞與視圖響應(yīng)鏈
如果時間一直傳遞到UIAppliction還是沒人處理蓝撇,那就會忽略掉
圖像顯示原理
1,CPU:輸出位圖
2,GPU:圖層渲染,紋理合成
3氢卡,把結(jié)果放到幀緩沖區(qū)黃總(frame buffer)
4,再由視頻控制器根據(jù)vsync信號在指定時間之前去提取幀緩沖區(qū)的屏幕顯示內(nèi)容
5晨缴,顯示到屏幕上
CPU工作
1译秦,Layout:UI布局,文本計算
2喜庞,Display:繪制
3诀浪,Prepare:圖片解碼
4棋返,Commit:提交位圖
GPU渲染管線
頂點著色延都,圖元裝配,光柵化睛竣,片段著色晰房,片段處理
UI卡頓掉幀原因
iOS設(shè)備的硬件時鐘會發(fā)出Vsync(垂直同步信號),然后app的cpu會去計算屏幕要顯示的內(nèi)容射沟,之后將計算好的內(nèi)容提交到gpu去渲染殊者,稅后,gpu將渲染結(jié)果提交到幀緩沖區(qū)验夯,等到下一個VSync到來時將魂寵趣的幀顯示到屏幕上猖吴,也就是說,一幀的顯示是由cpu和gpu共同決定的
一般來說挥转,頁面滑動流暢度是60fps海蔽,也就是1s有60幀更新,绑谣,如果cpu和gpu加起來的處理時間超過16.7ms党窜,就會造成掉幀甚至卡頓
滑動優(yōu)化方案
CPU:
把以下操作放在子線程中
1,對象創(chuàng)建借宵、調(diào)整幌衣、銷毀
2,預排版(布局計算壤玫、文本計算豁护、緩存高度等等)
3,預渲染(文本等異步繪制欲间,圖片解碼等)
GPU:
紋理渲染楚里,視圖混合 一般遇到性能問題時,考慮以下問題:
是否受到 CPU 或者 GPU 的限制括改?
是否有不必要的 CPU 渲染腻豌?
是否有太多的離屏渲染操作家坎?
是否有太多的圖層混合操作?
是否有奇怪的圖片格式或者尺寸吝梅?
是否涉及到昂貴的 view 或者效果虱疏?
view 的層次結(jié)構(gòu)是否合理?
UI繪制原理
異步繪制:
[self.layer.delegate displayLayer: ] 代理負責生成對應(yīng)的 bitmap 設(shè)置該 bitmap 作為該 layer.contents 屬性的值
離屏渲染
On-Screen Rendering:當前屏幕渲染苏携,指的是Gpu的渲染操作是在當前用于顯示的屏幕緩沖區(qū)中進行
Off-Screen Rendering:離屏渲染做瞪,分為CPU離屏渲染和GPU離屏渲染兩種方式
GPU離屏渲染是指在當前屏幕緩沖區(qū)外新開辟一個緩沖區(qū)進行渲染操作(應(yīng)當避免GPU離屏渲染)
GPU 離屏渲染何時會觸發(fā)呢? 圓角(當和 maskToBounds 一起使用時)右冻、圖層蒙版装蓬、陰影,設(shè)置
為什么要避免 GPU 離屏渲染纱扭?
GPU 需要做額外的渲染操作牍帚。通常 GPU 在做渲染的時候是很快的,但是涉及到 offscreen-render 的時候情 況就可能有些不同乳蛾,因為需要額外開辟一個新的緩沖區(qū)進行渲染暗赶,然后繪制到當前屏幕的過程需要做 onscreen 跟 offscreen 上下文之間的切換,這個過程的消耗會比較昂貴肃叶,涉及到 OpenGL 的 pipeline 跟 barrier蹂随,而且 offscreen-render 在每一幀都會涉及到,因此處理不當肯定會對性能產(chǎn)生一定的影響因惭。另外由于離屏渲染會增加 GPU 的工作量岳锁,可能會導致 CPU+GPU 的處理時間超出 16.7ms,導致掉幀卡頓蹦魔。所以 可以的話應(yīng)盡量減少 offscreen-render 的圖層