Android系統每隔16ms發出VSYNC信號,觸發對UI的渲染,想要達到界面流暢,必須實現60fps,也就意味着大多數的操做必須在16ms內完成。canvas
除了界面過於複雜致使的渲染不能及時完成以外,還存在過分繪製的問題。過分繪製就是某個像素在同一幀的時間內被繪製屢次,在多層次的UI界面中,若是不可見的UI也在進行繪製,那麼這些重合區域的像素就會被繪製屢次,從而浪費大量的CPU和GPU資源。 過分繪製也發生在背景重疊的狀況下,好比Layout中有本身的背景,同時子View中有本身的背景。佈局
如何檢測?性能
1.使用HierarchyViewer來查找Activity中的佈局是否過於複雜;優化
2.在開發者選項中打開Show GPU Overdraw選項進行觀察是否存在過分繪製;url
3.在開着選項中選擇Profile GPU Rendering,選中On screen as bar;.net
4.使用TraceView來觀察CPU的執行狀況。code
如何優化?對象
1.減小布局的層級,合理的使用include、merge、ViewStub;ip
2.自定義組件的onDraw()中避免大量建立臨時對象,好比String,以避免頻繁觸發GC;資源
3.自定義組件的onDraw()中,考慮使用canvas.clipRect()繪製須要被繪製的區域;
4.對於listView這樣的組件容器,考慮使用convertView、ViewHolder;
5.考慮使用性能更高的組件,好比推薦使用RecycleView來代替ListView,使用staticlayout來實現自動換行。