Android 硬件加速使用總結


從Android3.0(API Level 11)開始,支持硬件加速,可充分利用GPU的特性,使得界面渲染更加平滑,但是會消耗更多內存RAM。硬件加速自身並非完美,在某些Android5的rom上,由於內存RAM分配的問題,如果代碼不當,會引發閃屏、花屏等渲染問題。

硬件加速的主要原理,就是通過底層軟件代碼,將CPU不擅長的圖形計算轉換成GPU專用指令,由GPU完成。

1.Android3.0(API level 11)開始,2D渲染管道支持硬件加速,也就是說繪制操作可以使用GPU繪制在View的canvas上。使用硬件加速需要更多的資源,所以app會消耗更多內存。

2.硬件加速在Target API >= 14時是默認開啟的。

3.硬件加速還不支持所有的2D繪圖命令,開啟后可能會影響自定義View和繪圖操作。異常通常是不可見元素、運行異常、或者錯誤的像素點。

4.如果只使用系統的View和Drawable,則沒有任何副作用。

5.如果app里有自定義的繪圖操作,需要在開啟硬件加速的設備上測試來發現問題。

6.可以在4個級別上控制硬件加速
①應用:(AndroidManifest.xml)

<application
...
android:hardwareAccelerated="true"
...
>
②Activity:(AndroidManifest.xml)

<activity
android:name=".MainActivity"
android:hardwareAccelerated="true">
③Window:

getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
④View:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
在這四個層次中,應用和Activity是可以選擇的,Window只能打開,View只能關閉。

7.有兩種方式來檢測應用是否在使用硬件加速:

view.isHardwareAccelerated();// returns true if the View is attached to a hardware accelerated window.
canvas.isHardwareAccelerated();// returns true if the Canvas is hardware accelerated
推薦使用Canvas.isHardwareAccelerated()來檢測,因為View關聯到一個硬件加速的window上,仍然可以使用非硬件加速的canvas繪制。

9.View layers 
所有的Android版本View都可以在非屏幕內存(off-screen buffers)上渲染,使用view的drawing cache或者Canvas.saveLayer().非屏幕內存或者layers有許多用處,在對復雜對View做動畫或者做一些疊加復合效果時可以得到更好的性能。 
在Android3.0之后可以使用View.setLayerType()來控制如何使用layers。

LAYER_TYPE_NONE 默認行為,正常渲染,不會在off-screen buffer上備份
LAYER_TYPE_HARDWARE 如果應用開啟了硬件加速view渲染在硬件上,否則與LAYER_TYPE_SOFTWARE行為一樣
LAYER_TYPE_SOFTWARE 用軟件渲染在一個bitmap上
使用硬件加速有更高的效率,如果產生兼容性問題,可以用setLayerType改變渲染方式。

10.使用硬件加速在對一些view的屬性改變上有更高的效率,因為不需要view的invalidate和redrawn。屬性如下

alpha
x, y, translationX, translationY
scaleX, scaleY
rotation, rotationX, rotationY
pivotX, pivotY
對這些熟悉改變時最好使用硬件加速

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator.ofFloat(view, "rotationY", 180).start();

或者

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setLayerType(View.LAYER_TYPE_NONE, null);
}
});
animator.start();
GPU和CPU:

CPU(Central Processing Unit,中央處理器)是計算機設備核心器件,用於執行程序代碼,軟件開發者對此都很熟悉;GPU(Graphics Processing Unit,圖形處理器)主要用於處理圖形運算,通常所說“顯卡”的核心部件就是GPU。

下面是CPU和GPU的結構對比圖。其中:

黃色的Control為控制器,用於協調控制整個CPU的運行,包括取出指令、控制其他模塊的運行等;
綠色的ALU(Arithmetic Logic Unit)是算術邏輯單元,用於進行數學、邏輯運算;
橙色的Cache和DRAM分別為緩存和RAM,用於存儲信息。

 

從結構圖可以看出,CPU的控制器較為復雜,而ALU數量較少。因此CPU擅長各種復雜的邏輯運算,但不擅長數學尤其是浮點運算。

以8086為例,一百多條匯編指令大部分都是邏輯指令,數學計算相關的主要是16位加減乘除和移位運算。一次整型和邏輯運算一般需要1~3個機器周期,而浮點運算要轉換成整數計算,一次運算可能消耗上百個機器周期。
更簡單的CPU甚至只有加法指令,減法用補碼加法實現,乘法用累加實現,除法用減法循環實現。
現代CPU一般都帶有硬件浮點運算器(FPU),但主要適用於數據量不大的情況。
CPU是串行結構。以計算100個數字為例,對於CPU的一個核,每次只能計算兩個數的和,結果逐步累加。
和CPU不同的是,GPU就是為實現大量數學運算設計的。從結構圖中可以看到,GPU的控制器比較簡單,但包含了大量ALU。GPU中的ALU使用了並行設計,且具有較多浮點運算單元。
硬件加速的主要原理,就是通過底層軟件代碼,將CPU不擅長的圖形計算轉換成GPU專用指令,由GPU完成。
擴展:很多計算機中的GPU有自己獨立的顯存;沒有獨立顯存則使用共享內存的形式,從內存中划分一塊區域作為顯存。顯存可以保存GPU指令等信息。


硬件加速的優點:

硬件加速對渲染的流暢度有大幅提升。
在開啟硬件加速后,上下拖動列表的感覺是沒有跳幀的平滑拖動感,如果沒有硬件加速,拖動時能感受到有丟幀。
在窗體切換動畫上也類似,硬件加速開關對切換動畫的影響很大。

對於video、canvas、webgl,沒有硬件加速是沒法商用的,Android webview里video標簽里的視頻如果沒有硬件加速會看不到畫面。


硬件加速的代價
硬件加速屬於雙緩沖機制,使用顯存進行頁面渲染(使用較少的物理內存),導致更頻繁的顯存操作,可能引起以下現象:
白屏、花屏、閃屏;
低RAM內存配置手機上閃退。
雖然新出的Android5.0的手機整體配置較高(顯存較大),但是如果頁面中使用大量圖片或者過於復雜的CSS樣式時同樣容易出現白屏、花屏、閃屏現象。

解決硬件加速造成的問題有2個思路,1.降低頁面的內存占用,給硬件加速騰出RAM;2.在適當的地方關閉硬件加速。

 

 

參考文章:

《Android硬件加速原理與實現簡介》

《關於Android硬件加速技術分析》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM