1. 程式人生 > >Android學習之——優化篇(2)

Android學習之——優化篇(2)

壓縮 基礎 item 基本數據 android應用 質量 例如 沒有 事情

一、高級優化

? ? 上篇主要從0基礎優化的方式,本篇主要將從程序執行性能的角度出發,分析各種經常使用方案的不足。並給出對象池技術、基礎數據類型替換法、屏蔽函數計算三種能夠節省資源開銷和處理器時間的優化策略。

? ??眼下普遍採用的優化方案有:

? ??·?優化循環。通過又一次組織反復的子表達式來提高循環體的執行性能

? ??·?降低使用對象的數量來提高執行性能

? ??·?縮減網絡數據傳輸來縮短等待時間等

? ??本篇學習另外三種性能優化的策略:

? ??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.?局部使用基本數據類型取代對象,節省資源開銷

? ??3.?用簡單的數值計算取代復雜的函數計算,節省處理器時間

二、 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]);
}<span style="font-family: ‘Microsoft YaHei‘; background-color: rgb(255, 255, 255);">?</span>

???? ??一個類似的原則就是:絕不在一個 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。

<ViewStub
	android:inflatedId="@+id/subTree"
	android:layout="@layout/mySubTree"
	android:layout_width="120dp"
	android:layout_height="40dp" />
? ??? ??<include />:能夠通過這個標簽直接載入外部的xml到當前結構中。是復用 UI 資源的經常使用標簽。

? ??? ??<requestFocus /> 標簽用於指定屏幕內的焦點View 。使用方法是將標簽至於 View 標簽內部

<EditText
	android:layout="@layout/mySubTree"
	android:layout_width="120dp"
	android:layout_height="40dp">
	<requestFocus />
</EditText>
? ??? ??<merge /> 標簽:優化 UI 結構時起到非常關鍵的數據。目的是通過刪減多余或者額外的層級。從而優化整個 Android Layout 的結構。

四、圖片優化

? ??1. 圖片壓縮

? ??? ??圖片縮小的操作是刪除部分像素點,小圖放大則要人為地加入一些像素點。圖片放大不總是成倍的。在移植到不同的手機時能夠先用菜單畫布界面 getWith() 以及 getHeight() 取得當前手機屏幕的寬度和高度,假設當前圖片不夠滿屏顯示就對圖片進行放大。相反則縮小。

也能夠自己定義屏幕顯示圖片的大小。如在屏幕上顯示多張圖片的縮略圖,使圖片方式的顯示更加豐富。

? ??2. 降低圖片容量

? ??? ? ·?將多張圖片集成到一張圖片上。

由於省去了多張圖片的文件頭、文件結束數據塊等。並且合並了調色板

? ? ????·?降低圖片的顏色數

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


Android學習之——優化篇(2)