60Hz 刷新頻率由來(lái)
12 fps :由于人類眼睛的特殊生理結(jié)構(gòu)搭儒,如果所看畫(huà)面之幀率高于每秒約 10-12 幀的時(shí)候,就會(huì)
認(rèn)為是連貫的
24 fps :有聲電影的拍攝及播放幀率均為每秒 24 幀获洲,對(duì)一般人而言已算可接受
30 fps :早期的高動(dòng)態(tài)電子游戲阱表,幀率少于每秒 30 幀的話就會(huì)顯得不連貫,這是因?yàn)闆](méi)有動(dòng)態(tài)模
糊使流暢度降低
60 fps 在與手機(jī)交互過(guò)程中贡珊,如觸摸和反饋 60 幀以下人是能感覺(jué)出來(lái)的最爬。 60 幀以上不能察覺(jué)
變化
當(dāng)幀率低于 60 fps 時(shí)感覺(jué)的畫(huà)面的卡頓和遲滯現(xiàn)象
Android 系統(tǒng)每隔 16ms 發(fā)出 VSYNC 信號(hào) (1000ms/60=16.66ms) ,觸發(fā)對(duì) UI 進(jìn)行渲染门岔, 如果每次渲染都成
功這樣就能夠達(dá)到流暢的畫(huà)面所需要的 60fps 爱致,為了能夠?qū)崿F(xiàn) 60fps ,這意味著計(jì)算渲染的大多數(shù)操作都必須
在 16ms 內(nèi)完成寒随。
卡頓原理分析
當(dāng)這一幀畫(huà)面渲染時(shí)間超過(guò)16ms的時(shí)候糠悯,垂直同步機(jī)制會(huì)讓顯示器硬件等待GPU完成柵格化渲染操作,這樣會(huì)讓這一幀畫(huà)面妻往,多停留了16ms互艾,甚至更多,這樣就造成了用戶看起來(lái)畫(huà)面停頓讯泣。
16毫秒的時(shí)間主要被兩件事情所占用
第一件:將UI對(duì)象轉(zhuǎn)換為一系列多邊形和紋理(1)(纫普?)
第二件:CPU傳遞處理數(shù)據(jù)到GPU。所以很明顯判帮,我們要縮短
這兩部分的時(shí)間局嘁,也就是說(shuō)需要盡量減少對(duì)象轉(zhuǎn)換的次數(shù),以及上
傳數(shù)據(jù)的次數(shù)(晦墙?布局自定義)
如何減少這兩部分的時(shí)間以至于在16ms完成呢
CPU減少xml轉(zhuǎn)換成對(duì)象的時(shí)間
GPU減少重復(fù)繪制的時(shí)間
什么是過(guò)度繪制
GPU的繪制過(guò)程悦昵,就跟刷墻一樣,一層層的進(jìn)行晌畅,16ms刷一次.這樣就會(huì)造成圖層覆蓋的現(xiàn)象但指,即無(wú)用的圖層還被繪制在底層,造成不必要的浪費(fèi)。
GPU過(guò)度繪制幾種情況
1棋凳,自定義控件中拦坠,ondraw方法做了過(guò)多重復(fù)繪制
2,布局層次太深剩岳,重疊性太強(qiáng)贞滨。用戶看不到的區(qū)域GPU也會(huì)渲染,導(dǎo)致耗時(shí)增加
過(guò)度繪制優(yōu)化方法:
1拍棕,減少背景重復(fù)
? 注意主題中的設(shè)置晓铆,去掉所有activity主題設(shè)置中的屬性
? 直接在styles.xml中設(shè)置<item name="android:windowBackground">@null</item>
? 非業(yè)務(wù)需要,不要去設(shè)置背景
2绰播,使用裁剪減少控件之間的重合部分
布局的優(yōu)化(主要減少cpu工作量)
常用工具
1骄噪,Android/sdk/tools/bin/uiautomatorviewer.bat
2,Android\sdk\tools\monitor.bat
3蠢箩,Device Monitor窗口中Hierarchy view
注意點(diǎn):
1.能在一個(gè)平面顯示的內(nèi)容链蕊,盡量只用一個(gè)容器
2.盡可能把相同的容器合并merge
3.能復(fù)用的代碼,用include處理谬泌,可以減少GPU重復(fù)工作