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硬件加速原理與實現簡介