Android GPU 過渡繪製小 Demo,真正的測試
最近也是年底了,大家也是各忙各的,有的炫耀年終獎,有的炫耀維多利亞的秘密。反正各種炫耀。
準備
嗯,你沒有進錯。這裡是性能板塊。我們還是回歸正題吧。畢竟在大話移動2.0上面我們也要說點性能的東西。最近也是一邊在外演講一邊自己學習中。我們這裡拿一個應用來看吧。首先打開手機中的該項設置。
嘗試測試
我們打開我們要測試的應用(注意這個是一個demo),進入主頁面之後我們看到如下的界面。
也許有同學就要說了,啊呀不對啊。這個顏色這樣了。有bug!!!但是問題就在這裡。到了這裡我們根本不能算測試完畢,這個至少在正確的認知中,這樣最多是測試不完整,因為你並不知道問題出在哪裡。所以接著我們還是要繼續做的,首先我們要來判斷是不是有問題。
標準
GPU繪製過渡,
顏色標識: 從好到差:藍-綠-淡紅-紅
藍色1x過度繪製 綠色2x過度繪製 淡紅色3x過度繪製 紅色超過4x過度繪製 那麼大家大概能夠心裡有數了。接著我們要來真正的測試了。
排查
那麼首先我們先來看下UI的結構。如下圖,我們得知是CustomViewAbove這個View。
我們必須追查到代碼里,主要我們會關注兩個。 1. 構造函數 2. 重寫的各種draw的方法
我們在代碼中看到如下構造方法和draw的方法。 ```java public CustomViewAbove(Context context) { this(context, null); }
public CustomViewAbove(Context context, AttributeSet attrs) {n super(context, attrs);n initCustomViewAbove();nn}nnvoid initCustomViewAbove() {n // setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);n this.setBackgroundColor(getResources().getColor(n R.color.backColor));n setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS);n setClickable(true);n setFocusable(true);n setWillNotDraw(false);n final Context context = getContext();n mScroller = new Scroller(context, sInterpolator);n final ViewConfiguration configuration = ViewConfiguration.get(context);n mTouchSlop = ViewConfigurationCompatn .getScaledPagingTouchSlop(configuration);n mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();n mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();n setInternalPageChangeListener(new SimpleOnPageChangeListener() {n public void onPageSelected(int position) {n if (mViewBehind != null) {n switch (position) {n case 0:n case 2:n mViewBehind.setChildrenEnabled(true);n break;n case 1:n mViewBehind.setChildrenEnabled(false);n break;n }n }n }n });nn final float density = context.getResources().getDisplayMetrics().density;n mFlingDistance = (int) (MIN_DISTANCE_FOR_FLING * density);n}n
首先我們從主界面上面可以看到是一個類似於fragment的控制項的效果,Android的Views大家都知道是一個樹狀結構,那麼其實有很多肉眼看不到的view是不用去繪製的。否則雖然看不到,但是依然會是影響性能的。我們經過嘗試之後,去掉了其中的nn```javanthis.setBackgroundColor(getResources().getColor(n R.color.backColor));n
在這裡的setBackground其實本身是繪製背景的,但是由於View的重疊,用戶並看不到這層繪製,但是的確重複繪製了。所以從效果上面我們可以看到從紅色變成了淡紅。
總結
大家不要上來就問測試怎麼測試,安全怎麼測試。性能和安全和你們執行測試用例,和UI的功能自動化是兩回事兒。很多需要人為的介入分析和嘗試。並不是說用一個工具去檢測下有沒有問題,有就有,沒有就沒有那麼簡單。希望大家明白這點。
by monkey
推薦閱讀: