原創(chuàng)文章,轉(zhuǎn)載注明出處蝶锋,多謝合作陆爽。
有段時間沒有跟新文章了,最近有點忙扳缕,但是博客也不能因此停更了慌闭,打起精神别威,立個flag,兩周內(nèi)把硬件加速總結完驴剔。
本篇文章先簡單做個硬件加速的開篇省古,介紹一些概念。
一丧失、硬件加速的概念
硬件加速:簡單理解就是通過底層軟件代碼豺妓,將CPU不擅長的圖形計算轉(zhuǎn)換成GPU專用指令,由GPU完成布讹。Android3.0開始支持硬件加速琳拭,Android4.0 默認啟用硬件加速。
硬件加速google官方文檔
注:
CPU : Central Processing Unit 描验, 中央處理器白嘁,是計算機設備核心器件,用于執(zhí)行程序代碼膘流。
GPU : Graphic Processing Unit 絮缅, 圖形處理器,主要用于處理圖形運算呼股,通常所說“顯卡”的核心部件就是GPU耕魄。
CPU更擅長復雜邏輯控制,而GPU得益于大量ALU和并行結構設計卖怜,更擅長數(shù)學運算屎开。
二、硬件加速與軟件繪制的區(qū)別
Android應用層的繪制主要有兩種:軟件繪制與硬件繪制马靠。
軟件繪制:CPU主導繪制奄抽,更新UI會重繪與臟區(qū)域相交的區(qū)域。
硬件加速:GPU主導繪制甩鳄,提高顯示刷新速度逞度、更新UI只重繪臟區(qū)域,但是內(nèi)存和電量消耗會比軟件繪制大妙啃。
對應的圖形庫也稍微介紹下:
Skia : CPU 繪制 2D 圖形档泽;
Open GL : GPU 繪制 2D / 3D 圖形;
之后Android Q開始會使用 vulkan 來作為默認的圖形庫揖赴,有興趣的可以提前了解下馆匿,這里不多贅述。
三燥滑、控制硬件加速
如果您的應用程序僅使用標準視圖和Drawables渐北,則全局打開它不應導致任何不利的繪圖效果。但是铭拧,由于所有2D繪圖操作都不支持硬件加速赃蛛,因此打開它可能會影響某些自定義視圖或繪圖調(diào)用恃锉。問題通常表現(xiàn)為不可見的元素,異撑槐郏或錯誤渲染的像素破托。為解決此問題,Android為您提供了在多個級別啟用或禁用硬件加速的選項歧蒋。
開發(fā)者可以在以下幾個級別控制硬件加速:
Application 整個應用程序使用硬件加速
<application android:hardwareAccelerated = “true” … >
Activity 單獨控制某個activity硬件加速的啟動和禁止
<activity android:hardwareAccelerated="false" />
Window
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注意:現(xiàn)階段你不能在Window級別對它禁用硬件加速土砂。
View
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
注意:現(xiàn)階段不能夠在View級別進行硬件加速。
檢查應用程序是否為硬件加速有兩種方法:
View.isHardwareAccelerated()
如果返回true則可以說明這個View所在的窗口已經(jīng)啟用了硬件加速疏尿。
Canvas.isHardwareAccelerated()
如果返回true則說明這個Canvas已經(jīng)啟用了硬件加速瘟芝。
最后直觀比較下軟件繪制和硬件加速繪制:
相同app的軟件繪制與硬件繪制對比:
軟件繪制:
硬件加速繪制:
對比看,硬件加速繪制一幀UI的繪制速度要明顯優(yōu)于軟件繪制褥琐。