Android學習之——最佳化篇(2)

來源:互聯網
上載者:User

標籤:android   java   

一、進階最佳化

    上篇主要從初級最佳化的方式,本篇主要將從程式運行效能的角度出發,分析各種常用方案的不足,並給出對象池技術、基礎資料類型替換法、屏蔽Function Compute三種能夠節省資源開銷和處理器時間的最佳化策略。

    目前普遍採用的最佳化方案有:

    · 最佳化迴圈,通過重新組織重複的子運算式來提高迴圈體的運行效能

    · 減少使用對象的數量來提高運行效能

    · 縮減網路傳輸資料來縮短等待時間等

    本篇學習另外三種效能最佳化的策略:

    1. 採用對象池技術,提高對象的利用率

        Java 中建立和釋放對象會佔用相當大的資源,採用對象池技術,用來提高對象的利用率

        例如:遊戲中敵機處理方式:方法一是遊戲載入關卡時候,為每架敵機建立一個對象,這種方案中建立對象的資源開銷巨大,因此嚴重影響手機遊戲的運行效能。方法二是遊戲進程中,動態建立敵機對象,被擊毀以後將對象設定為null並由System.gc() 回收。

        遊戲效能損耗主要在建立和釋放對象,而不建立對象又無法實現邏輯功能,因此要盡量避免對象的建立和釋放。

        解決方案:根據需求先建立一定量的對象,在需要的建立對象的時候從對象池中申請空閑對象,釋放對象時把對象釋放回池中,以有效避免由建立和釋放對象帶來的效能損失

        上例中需求是敵機不超過5架,所以可以使用如下代碼:

Enemy[5] enemy = new Enemy[5];for(int i = 0; i<5;i++){enemy[i] = new Enemy();}
        在類Enemy 李增加標誌屬性used 和帶參數的 reset 方法使對象可重設到初始狀態,在載入遊戲關卡的時候初始化對象池,在需要建立對象的時候從對象池擷取一個未被使用的對象並使用 reset 方法初始化,需要釋放對象的時候只需將標誌位修改以供下次使用。

    2. 局部使用基礎資料型別 (Elementary Data Type)代替對象,節省資源開銷

    3. 用簡單的數值計算代替複雜的Function Compute,節省處理器時間

二、 Android 高效開發

    兩個基本原則:不要做不必要做的事情;儘可能的節省記憶體的使用。

    1. 儘可能的避免建立對象。如下最佳化案例:

       ·從原始輸入資料中提取字串時,試著從原始字串返回一個子字串,而不是建立一份副本。你將會建立一個新的字串對象,但是它和你的未經處理資料共用資料空間。

        ·如果你有一個返回字串的方法,你應該知道無論如何返回的結果是StringBuffer,改變你的函數的定義和執行,讓函數直接返回而不是通過建立一個臨時的對象。

        ·一個 Int 類型數組要比一個 Integer 類型的數組要好,但同樣也可以歸納這樣一個原則,兩個 Int 類型的數組要比一個 (int, int) 對象數組的效率高得多。其他基礎資料類型也是如此。

       · 兩個平行的 Foo[] 和 Bar[] 要比一個(Foo,Bar) 對象數組的效率高得多

        一般來說,我們應該儘可能地避免建立短期的臨時對象。越少的對象建立意味著越少的記憶體回收,這樣提高你程式的經驗品質。

    2. 使用自身方法

        當處理字串的時候,不要猶豫,儘可能多地使用諸如: String.indexOf()、String.lastIndexOf() 這樣對象自身帶有的方法。因為這些方法是用C/C++ 來實現的,比Java 迴圈來的快10~100 倍

    3. 使用虛擬優於使用介面

        假設你有一個 HashMap 對象,你可以申明它是一個 HashMap 或者只是一個 Map,如下:

Map myMap1 = new HashMap();HashMap myMap2 = new HashMap();
        一般來說明智的做法是使用 Map,因為它允許你改變 Map 介面執行上面的任何東西,。相對於通過具體的引用進行虛擬函數的調用,通過介面引用來調用會花費2倍以上的時間。

    4. 使用靜態優於使用虛擬

        如果你沒有必要去訪問對象的外部,那麼就使你的方法成為靜態。它會被更快的調用,因為它不需要一個虛擬函數導向表。調用這個方法不會改變對象的狀態。

    5. 儘可能避免使用內在的Get,Set 方法

        虛方法的調用會產生很多代價,比執行個體屬性查詢的代價還要多。我們應該在外部調用時使用 Get 和 Set 函數,但是在內部調用時,我們應該直接調用。

    6. 緩衝屬性調用

for(int i = 0; i < this.mCount; i++){dumpItem(this.mItems[i]);}
        應該這樣寫:
int count = this.mCount;for(int i = 0; i < count; i++){dumpItem(this.mItems[i]);}
        一個相似的原則就是:絕不在一個 For 語句中第二次調用一個類的方法。

    7. 申明 Final 常量

static String strVal = "100";static final String strVal = "100";
       不加 final 編譯器會調用一個類初始化方法 <clinit>,這個方法為strVal 在類檔案字串常量表中提取一個引用。加了final就不會調用,因為這些常量直接寫入了類檔案靜態屬性初始化中,這個初始化直接由虛擬機器來處理。

        將一個類或者方法申明為“final” 並不會帶來任何執行上的好處,它能夠進行一定的最佳化處理。如果編譯器知道一個Get 方法不能被子類重載,那麼它就該把函數設定成 Inline

    8. 慎用增強型 For 迴圈語句

        在其他收集器裡面,增強型 for 迴圈相當於 iterator 的使用。

    9. 避免列舉類型

    10. 通過內聯類使用包空間

    11. 避免浮點類型的使用

        嵌入式的處理器通常不支援浮點數的處理,因此所有的 float 和 double 操作都是通過軟體進行的,一些基本的浮點數的操作就需要花費毫秒級的時間。

三、Android UI 最佳化

    1. RelativeLayout 和 LinearLayout 在資源利用上,前者佔用更少的資源而達到相同的目的。

        RelativeLayout 需要注意的是內部是通過多個View 之間的關係確定的架構,所以當其中一個View 因為某些需要調用 GONE 來完全隱藏掉以後,會影響與其相關聯的Views。 解決方案是使用 alignWithParentIfMissing屬性 來解決類型的問題。

    2.  <viewStub />此標籤可以使 UI在特殊情況下,直觀效果類似於設定 View 的不可見度,但是更大的意義在於被這個標籤所包裹的 View 在預設狀態下不會佔用任何記憶體空間。 viewStub 通過 include 從外部匯入 View 元素。用法是通過 android:layout 來指定所包含的內容。預設情況下, ViewStub 所包含的標籤都屬於 visibility = GONE。 viewStub 通過方法 inflate() 來召喚系統載入其內部的 View。

<ViewStubandroid:inflatedId="@+id/subTree"android:layout="@layout/mySubTree"android:layout_width="120dp"android:layout_height="40dp" />
        <include />:可以通過這個標籤直接載入外部的xml到當前結構中,是複用 UI 資源的常用標籤。

        <requestFocus /> 標籤用於指定螢幕內的焦點View 。用法是將標籤至於 View 標籤內部

<EditTextandroid:layout="@layout/mySubTree"android:layout_width="120dp"android:layout_height="40dp"><requestFocus /></EditText>
        <merge /> 標籤:最佳化 UI 結構時起到很重要的作用。目的是通過刪減多餘或者額外的層級,從而最佳化整個 Android Layout 的結構。

四、圖片最佳化

    1. 圖片壓縮

        圖片縮小的操作是刪除部分像素點,小圖放大則要人為地添加一些像素點。圖片放大不總是成倍的。在移植到不同的手機時可以先用菜單畫布介面 getWith() 以及 getHeight() 取得當前手機螢幕的寬度和高度,如果當前圖片不夠滿屏顯示就對圖片進行放大,相反則縮小。也可以自訂螢幕顯示圖片的大小,如在螢幕上顯示多張圖片的縮圖,使圖片方式的顯示更加豐富。

    2. 減少圖片容量

        · 將多張圖片整合到一張圖片上。因為省去了多張圖片的檔案頭、檔案結束資料區塊等,而且合并了調色盤

        · 減少圖片的顏色數

歡迎轉載,轉載註明出處,謝謝
Mr.傅:閱讀自《Android應用開發揭秘》


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.