硬體加速指的是利用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可能會導致整個介面花屏(文字,按鈕,圖形有大有小,不是自己設定的大小)。
更多硬體加速推薦文章