原理
可以簡單理解為通過底層軟體**,將 cpu 不擅長的圖形計算轉換為 gpu 專用指令,由 gpu 完成。
當目標 api 級別大於等於 14 時,硬體加速預設開啟。
控制硬體加速
我們可以在以下 4 個級別控制硬體加速:
在清單檔案種,加入以下屬性,為整個應用啟用硬體加速:
activity
在清單檔案中對應的 標籤下新增下面**:
window
window 級別不能停用硬體加速。
window.setflags(
windowmanager.layoutparams.flag_hardware_accelerated,
windowmanager.layoutparams.flag_hardware_accelerated
view
view 不能啟用硬體加速,只能停用硬體加速,如下:
view.setlayertype(view.layer_type_software, null)
displaylist
displaylist 是乙個基本繪製元素,包含元素原始屬性(位置、尺寸、角度、透明等),當 view 的一些屬性改變(scale 、rotate、alpha、translate),只需把屬性更新給 gpu,不需要生成新的 displaylist。
rendernode
乙個 rendernode 包含若干個 displaylist,通常乙個 rendenode 對應乙個 view,包含 view 及其 view 的所有 displaylist。
軟體繪製與硬體繪製
軟體繪製
繪製內容會被 cpu 轉換成實際的畫素(由 bitmap 來承載),然後直接渲染到螢幕上。
硬體繪製
繪製的內容會轉換成 gpu 的操作儲存下來(由 displaylist 來承載),再交給 gpu 來操作。
來自美團
場景1中,無論是否開啟硬體加速,遍歷 view 樹並都會走 draw 路徑。硬體加速後 draw 路徑不做實際繪製工作,只是構建 displaylist,複雜的繪製計算被 gpu 分擔。
場景2 中,textview 設定前後尺寸位置不變,不會觸發重新 layout。
軟體繪製中,textview 所在的區域及為髒區,由於 textview 有透明區域,遍歷 view 樹的過程中,和髒區重疊的多數 view 都要重繪,包括與之重疊的的兄弟節點和他們的父節點,不要繪製的 view 在 draw(canvas canvas, viewgroup parent, long drawingtime) 方法中判斷直接返回。
判斷 view 是否經過硬體加速
view.ishardwareaccelerated()
當 view 已經附著到啟用硬體加速的 window 後,這個方法只會返回 true,即使在設定了 view.setlayertype(view.layer_type_software, null) 之後。如果 view 已經附著到關閉硬體加速的 window 中,則只會返回 false。這種判斷方法並不靠譜。
canvas.ishardwareaccelerated(),如果 canvas 經過硬體加速,則其會返回 true。在繪製**中如果要判斷 view 是否啟用硬體加速時,應該用這個方法而不是上面那個。
viewlayer
view layer 又稱離屏緩衝,它的作用是單獨開闢一塊地方來繪製 view,
前面提到 view 不能啟用硬體加速,只能停用硬體加速具體展開情況如下:
如果 view 附著的 window 啟用硬體加速,則可通過 view.setlayertype(view.layer_type_software, null) 關閉(暫停)硬體加速,此後還是可以通過 view.setlayertype(view.layer_type_software, null) 或者 view.setlayertype(view.layer_type_none, null) 來恢復硬體加速的,因為 window 一開始是支援硬體加速的,故不能說 view 能啟動硬體加速。
如果 view 附著 的 window 沒有啟用硬體加速(activity 關閉了硬體加速),無論 view 設定 layertype 為何值,都不能啟用硬體加速。
當我們設定了 view layer 後,繪製操作會被快取下來,而且快取的的是最終的繪製結果。這樣,view 的重繪效率進一步提公升:只要繪製的內容沒有變,那麼無論是軟體繪製(cpu)還是硬體繪製(gpu),它們都不用重新計算,只用之前的快取的繪製結果即可。(可以對標載入快取來理解。)
硬體加速與動畫
view.setlayertype(view.layer_type_hardware, null)
addlistener(object : animatorlisteneradapter() {
override fun onanimationend(animation: animator) {
view.setlayertype(view.layer_type_none, null)
start()
參考
Android 硬體加速
開啟或關閉硬體加速 由於硬體加速自身並非完美無缺,所以android提供選項來開啟或者關閉硬體加速,預設是關閉。可以在4個級別上開啟或者關閉硬體加速 activity級別 window級別 getwindow setflags windowmanager.layoutparams.flag hard...
Android硬體加速
android從3.0 apilevel11 開始,在繪製view的時候支援硬體加速,充分利用gpu的特性,使得繪製更加平滑,但是會多消耗一些記憶體。開啟或關閉硬體加速 由於硬體加速自身並非完美無缺,所以android提供選項來開啟或者關閉硬體加速,預設是關閉。可以在4個級別上開啟或者關閉硬體加速 ...
Android硬體加速
從android3.0 api level 11 開始,支援硬體加速,可充分利用gpu的特性,使得介面渲染更加平滑。但是硬體加速自身並非完美,在某些webview版本上,比如android5初期的一些rom上的webview版本是chrome37 38版本,由於其本身的硬體加速策略的bug,導致 稍...