第一步:要明白的幾個名詞
16ms是什么意思
大多數的Android顯示屏幕是以每秒60幀來刷新的(也就是60Hz)。一幀可以看做是一張的獨立圖片,60幀每秒就意味著:16ms=1000/60Hz,相當于60fps。這就是上面說的16ms
為什么有60fps這個概念?
這是因為人眼與大腦之間的協作無法感知超過60fps的畫面更新。12fps大概類似手動快速翻動書籍的幀率,這明顯是可以感知到不夠順滑的。24fps使得人眼感知的是連續線性的運動,這其實是歸功于運動模糊的 效果。24fps是電影膠圈通常使用的幀率,因為這個幀率已經足夠支撐大部分電影畫面需要表達的內容,同時能夠最大的減少費用支出。但是低于30fps是 無法順暢表現絢麗的畫面內容的,此時就需要用到60fps來達到想要的效果,當然超過60fps是沒有必要的(據說Dart能夠帶來120fps的體驗)
柵格化
柵格化簡單來說就是將向量圖轉化為機器可以識別的位圖的一個過程。其中很復雜也比較很耗時,GPU就是用來加快柵格化的速度
第二步:記錄幾個 優化方法
1.盡可能減少Overdraw,就是減少過渡繪制,減少布局嵌套的層次,去掉重復設置的背景;
藍色、淡綠、淡紅,深紅代表了4種不同程度的Overdraw的情況,我們的目標就是盡量減少紅色Overdraw,看到更多的藍色區域。
減少層級方法:
1.1、善用相對布局Relativelayout
1、本身來說用Relative Layout會比最外層用其他例如LinearLayout要少一層
2、LinearLyoaut太過單一,復雜一點的就得嵌套來實現,用Relative Layout則不用
例如:
1.2、viewstub標簽
平時開發會遇到動態控制某個view是否顯示,一般做法是直接再Xml里設置gone,優點:邏輯處理簡單,比較靈活 ;缺點:雖然把View的初始可見View.GONE但是在Inflate布局的時候View仍然會被Inflate,也就是說仍然會創建對象,會被實例化,會被設置屬性。也就是說,會耗費內存等資源
推薦的做法是使用Android.view.ViewStub
ViewStub是一個輕量級的View,它一個看不見的,不占布局位置,占用資源非常小的控件。可以為ViewStub指定一個布局,在Inflate布局的時候,只有ViewStub會被初始化,然后當ViewStub被設置為可見的時候,或是調用了ViewStub.inflate()的時候,ViewStub所向的布局就會被Inflate和實例化,然后ViewStub的布局屬性都會傳給它所指向的布局。這樣,就可以使用ViewStub來方便的在運行時,要還是不要顯示某個布局。
但ViewStub也不是萬能的,下面總結下ViewStub能做的事兒和什么時候該用ViewStub,什么時候該用可見性的控制。
點擊詳見
1.3、merge標簽
merge標簽是作為include標簽的一種輔助擴展來使用,它的主要作用是為了防止在引用布局文件時產生多余的布局嵌套。
子布局外層用的layout,被include過來的外層也有個layout,這樣就造成了多余的布局嵌套
2.減少listview中getView中的耗時操作,一些自定義的view盡可能減少invalidate的調用;
3.盡可能不要在UI線程做過多耗時的操作;
參考:
http://www.cnblogs.com/hoolay/p/6248514.html
http://www.lxweimin.com/p/02800806356c