編輯:安卓省電與加速
圖形的渲染可分為兩種:軟件渲染和硬件渲染。軟件渲染是靠CPU計算各種坐標並繪制,主要是占用內存;硬件渲染是靠GPU,主要占用顯存,一般的3D圖形程序(OpenGL、DirectX)都是GPU加速的。
在Android3.0之前,2D繪圖API只支持軟件渲染模式,從Android3.0開始,2D繪圖API開始支持GPU硬件渲染,即View中的Canvas的繪圖操作會使用GPU,所以從Android 3.0(API Level 11)開始,View中就多了一些和硬件相關的方法。如果App的AndroidManifest.xml文件中定義的 targetSdkVersion大於或等於14(Android 4.0),那麼Android會默認為App啟用GPU渲染2D圖形,我們也可以自己決定是否使用GPU,見下文。如果開啟了GPU硬件加速,那麼Android會用OpengGL繪圖中常見的Display List技術對OpenGL ES中的繪圖命令進行緩存,提高繪圖效率與速度。關於Android中GPU硬件加速的Display List繪圖機制會在以後專門寫文章進行闡述,本文不做過多介紹。
我們也可以顯式地啟用或禁用GPU渲染,並且可以從多個Application、Activity、Window、View多個級別對其進行控制。
Application
在AndroidMenifest.xml的中添加如下的屬性即可在整個App的所有Activity的View中啟用GPU硬件加速渲染2D圖形:
Activity
你既可以在Application級別上控制GPU是否啟用,也可以在Activity級別對其就進行控制。比如你的App中有多個Activity,你想讓大部分Activity啟用GPU硬件加速,但有一個Activity你不想啟用硬件加速,你可以通過以下的配置實現:
Window
如果你想要更加細粒度地對GPU的使用進行控制,你可以通過代碼對指定的Window啟用GPU硬件加速,如下代碼所示:
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
需要注意的是在運行時不能通過代碼禁用掉某個Window的硬件加速。
View
你也可以在運行時通過如下代碼為某個指定的View禁用掉GPU硬件加速:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
//View從API Level 11才加入setLayerType方法
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
View從API Level 11才加入setLayerType方法,所以在使用前需要判斷一下當前系統運行的版本。 需要注意的是,在運行時不能通過代碼為某個View啟用GPU硬件加速。
從Android 3.0(API Level 11)開始,View和Canvas類都加入了isHardwareAccelerated()方法,可以用於判斷當前View和Canvas是否處於硬件加速中。
View.isHardwareAccelerated()
如果View的isHardwareAccelerated()方法返回true,僅僅表示該View被加入到一個處於硬件加速的Window中,其有可能仍然使用一個非硬件加速的Canvas進行實際的渲染。所以,通常來說View的isHardwareAccelerated()方法實際用處不太大。
Canvas.isHardwareAccelerated()
我們在View的onDraw回調方法中可以得到Canvas對象,如果Canvas的isHardwareAccelerated()方法返回true,那麼表示當前Canvas是用GPU硬件加速渲染的,如果返回false就表示是用軟件渲染的。通常,判斷當前Canvas是否處於GPU硬件加速中對於繪制自定義的View來說比較重要,下面會解釋。
開啟GPU硬件加速會提升程序的繪圖效率,但是也存在一定的局限性。
啟用GPU硬件加速會增加內存的使用。
Android中有些2D繪圖API在GPU硬件加速時不能使用或者要到某個指定的版本才能使用。
Canvas
以下為Canvas中在GPU硬件加速時受限制的功能:
第一列是受限制的方法,第二列是開始支持的API Level,紅叉代表到目前還不支持。
Paint
以下為Paint中在GPU硬件加速時受限制的功能:
Xfermode
以下為Xfermode在GPU硬件加速時受限制的功能:
Shader
以下為Shader在GPU硬件加速時受限制的功能:
Canvas縮放
Android中硬件加速的2D渲染管線最初只支持無縮放的繪圖,這會導致在將縮放比例設置為很大的時候,繪圖質量會明顯降低。最初,GPU加速下的2D繪圖操作會被渲染成一個縮放比例為1.0的紋理,然後GPU會將它縮放到指定比例尺。在API Level小於17的時候,隨著縮放比例scale的變大,繪圖質量就更加難以保證。下面的表格表示了從什麼版本開始Android能在GPU硬件計算下正確處理2D圖形的大比例縮放問題:
閱讀:
我的Android博文整理匯總
Android中Canvas繪圖基礎詳解(附源碼下載)
版權聲明:本文為博主原創文章,未經博主允許不得轉載。如果覺得文章不錯,記得頂一下!如果有疑問覺得文章中有錯誤,歡迎大家在評論中給我留言指正,看到會及時回復,多多交流
Android加速度傳感器效果圖 手機平放桌面的兩張截屏,數據一直在刷新源碼下載地址(Android Studio工程):http://download.csdn.net
有朋友反應Nexus 5在使用的過程中太耗電了,續航能力很差,其實Nexus 5雖然只是配備了2300mAh的電池
現在智能手機發展已經快到了目瞪口呆的地步,尤其今年旗艦新機都讓我們看花了眼。各種頂級的配置雖然看著好看,但也給我們留了一個大問號---這麼高的配置,手機電
用Android(安卓)手機的都是好男人,因為每天都必須要回家充電。這是個廣為流傳的笑話,卻真實的反映了安卓手機的尴尬——費電。智能手機如何省電有