Android進階:開啟硬體加速

語言: CN / TW / HK

硬體加速指的是利用CPU和GPU各自的特性,將繪製工作一分為二,CPU負責複雜的邏輯運算,利用底層軟體程式碼,將CPU不擅長的圖形計算轉換成GPU專用指令,由GPU完成,從而加快繪製速度。

開啟硬體加速

在分析Android的繪製流程中,定位到ViewRootImpl類的draw函式,會發現在這裡會有繪製的兩個分支,一個走的是硬體繪製 mAttachInfo.mThreadedRenderer.draw函式,一個是軟體繪製drawSoftware函式。而它們的判斷走向條件是mAttachInfo.mThreadedRenderer != null && mAttachInfo.mThreadedRenderer.isEnabled()為true走硬體繪製,false軟體繪製。定位到mThreadedRenderer初始化的地方enableHardwareAcceleration函式;

1、當application處於相容模式,不允許硬體加速。什麼是相容模式?當AndroidMainfest.xml設定application節點的屬性android:anyDensity=false,會導致mTranslator不為null,從而不支援硬體加速。該屬性預設是true,表示適應任何螢幕密度。

2、請求開啟硬體加速,即設定了FLAG_HARDWARE_ACCELERATED屬性。請求了硬體加速,不保證一定開啟了硬體加速,還需要根據後面的情況。

如何設定該屬性,以請求硬體加速呢?

應用級別,在AndroidManifest.xml檔案,application節點新增下面屬性。

//開啟
<application android:hardwareAccelerated="true" ...>
//關閉
<application android:hardwareAccelerated="false" ...>
複製程式碼

Activity 級別,在AndroidManifest.xml檔案,activity節點新增下面屬性。

//開啟加速
<activity android:hardwareAccelerated="true" />
//關閉加速
<activity android:hardwareAccelerated="false" />
複製程式碼

視窗級別,在Activity或Dialog的onCreate方法中,setContentView函式之前,呼叫下面程式碼開啟硬體加速。

window.setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, 
	WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)
複製程式碼

通過程式碼開啟的視窗級別硬體加速是沒辦法停止的。而View級別可以停用硬體加速,但無法開啟加速。

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
複製程式碼

3、在請求了硬體加速之後,需要判斷當前裝置是否支援硬體加速。

裝置是真機,則支援是硬體加速;SurfaceFlinger服務開啟失敗,不支援硬體加速;若是虛擬機器,其是OpenGL ES 2.0則支援硬體加速。

侷限

並不是所有的View或者圖形能通過GPU來繪製完成,具體約束可以參考Android官方文件,硬體加速。同時硬體加速也會帶來一些坑,例如,在硬體加速情況下,WebView可能會導致整個介面花屏(文字,按鈕,圖形有大有小,不是自己設定的大小)。

更多硬體加速推薦文章

理解Android硬體加速原理的小白文

Android硬體加速原理與實現簡介