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