第一步:要明白的幾個名詞
16ms是什么意思
大多數(shù)的Android顯示屏幕是以每秒60幀來刷新的(也就是60Hz)。一幀可以看做是一張的獨立圖片菩浙,60幀每秒就意味著:16ms=1000/60Hz粤攒,相當(dāng)于60fps望抽。這就是上面說的16ms
為什么有60fps這個概念算途?
這是因為人眼與大腦之間的協(xié)作無法感知超過60fps的畫面更新。12fps大概類似手動快速翻動書籍的幀率隘梨,這明顯是可以感知到不夠順滑的程癌。24fps使得人眼感知的是連續(xù)線性的運動,這其實是歸功于運動模糊的 效果轴猎。24fps是電影膠圈通常使用的幀率嵌莉,因為這個幀率已經(jīng)足夠支撐大部分電影畫面需要表達的內(nèi)容,同時能夠最大的減少費用支出捻脖。但是低于30fps是 無法順暢表現(xiàn)絢麗的畫面內(nèi)容的锐峭,此時就需要用到60fps來達到想要的效果,當(dāng)然超過60fps是沒有必要的(據(jù)說Dart能夠帶來120fps的體驗)
柵格化
柵格化簡單來說就是將向量圖轉(zhuǎn)化為機器可以識別的位圖的一個過程可婶。其中很復(fù)雜也比較很耗時沿癞,GPU就是用來加快柵格化的速度
第二步:記錄幾個 優(yōu)化方法
1.盡可能減少Overdraw,就是減少過渡繪制矛渴,減少布局嵌套的層次椎扬,去掉重復(fù)設(shè)置的背景;
藍色具温、淡綠蚕涤、淡紅,深紅代表了4種不同程度的Overdraw的情況铣猩,我們的目標(biāo)就是盡量減少紅色Overdraw钻趋,看到更多的藍色區(qū)域。
減少層級方法:
1.1剂习、善用相對布局Relativelayout
1蛮位、本身來說用Relative Layout會比最外層用其他例如LinearLayout要少一層
2、LinearLyoaut太過單一鳞绕,復(fù)雜一點的就得嵌套來實現(xiàn)失仁,用Relative Layout則不用
例如:
1.2、viewstub標(biāo)簽
平時開發(fā)會遇到動態(tài)控制某個view是否顯示们何,一般做法是直接再Xml里設(shè)置gone萄焦,優(yōu)點:邏輯處理簡單,比較靈活 冤竹;缺點:雖然把View的初始可見View.GONE但是在Inflate布局的時候View仍然會被Inflate拂封,也就是說仍然會創(chuàng)建對象,會被實例化鹦蠕,會被設(shè)置屬性冒签。也就是說,會耗費內(nèi)存等資源
推薦的做法是使用Android.view.ViewStub
ViewStub是一個輕量級的View钟病,它一個看不見的萧恕,不占布局位置刚梭,占用資源非常小的控件∑彼簦可以為ViewStub指定一個布局朴读,在Inflate布局的時候,只有ViewStub會被初始化走趋,然后當(dāng)ViewStub被設(shè)置為可見的時候衅金,或是調(diào)用了ViewStub.inflate()的時候,ViewStub所向的布局就會被Inflate和實例化簿煌,然后ViewStub的布局屬性都會傳給它所指向的布局典挑。這樣,就可以使用ViewStub來方便的在運行時啦吧,要還是不要顯示某個布局。
但ViewStub也不是萬能的拙寡,下面總結(jié)下ViewStub能做的事兒和什么時候該用ViewStub授滓,什么時候該用可見性的控制。
點擊詳見
1.3肆糕、merge標(biāo)簽
merge標(biāo)簽是作為include標(biāo)簽的一種輔助擴展來使用般堆,它的主要作用是為了防止在引用布局文件時產(chǎn)生多余的布局嵌套。
子布局外層用的layout诚啃,被include過來的外層也有個layout淮摔,這樣就造成了多余的布局嵌套
2.減少listview中g(shù)etView中的耗時操作,一些自定義的view盡可能減少invalidate的調(diào)用始赎;
3.盡可能不要在UI線程做過多耗時的操作和橙;
參考:
http://www.cnblogs.com/hoolay/p/6248514.html
http://www.reibang.com/p/02800806356c