Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> 安卓省電與加速 >> Android應用開發:圖形繪制之硬件加速

Android應用開發:圖形繪制之硬件加速

編輯:安卓省電與加速

引言


在Android3.0後,Android的2D渲染通道開始支持硬件加速,也就是說所有View的Canvas繪畫動作都會使用GPU,同時也代表著應用程序會損耗更多的內存。而在Android4.0(API14)之後硬件加速功能就被默認開啟了。如果你的應用程序是由各種標准View和Drawable組成的,那麼硬件加速並不會引起任何不適。眾所周知,使用硬件加速會調用到OpenGL,但是OpenGL不同版本會存在不支持一些操作的情況,也就是說,硬件加速可能會影響一些自定義View及繪制過程。因此,Android系統提供了關閉硬件加速的方法,好的消息是,可以在不同層級上對硬件加速功能進行控制,而不至於整個應用程序因為某一個繪制動作的障礙而整體都不能使用硬件加速,畢竟硬件加速能夠帶來更加流暢、更加絢麗的界面效果。


不支持的列表

PS:列表有錯位,標題向後移動一個


API level < 16 16 17 18 Canvas drawBitmapMesh() (colors array) ? ? ? ? drawPicture() ? ? ? ? drawPosText() ? ? ? ? drawTextOnPath() ? ? ? ? drawVertices() ? ? ? ? setDrawFilter() ? ? ? ? clipPath() ? ? ? ? clipRegion() ? ? ? ? clipRect(Region.Op.XOR) ? ? ? ? clipRect(Region.Op.Difference) ? ? ? ? clipRect(Region.Op.ReverseDifference) ? ? ? ? clipRect() with rotation/perspective ? ? ? ? Paint setAntiAlias() (for text) ? ? ? ? setAntiAlias() (for lines) ? ? ? ? setFilterBitmap() ? ? ? ? setLinearText() ? ? ? ? setMaskFilter() ? ? ? ? setPathEffect() (for lines) ? ? ? ? setRasterizer() ? ? ? ? setShadowLayer() (other than text) ? ? ? ? setStrokeCap() (for lines) ? ? ? ? setStrokeCap() (for points) ? ? ? ? setSubpixelText() ? ? ? ? Xfermode AvoidXfermode ? ? ? ? PixelXorXfermode ? ? ? ? PorterDuff.Mode.DARKEN (framebuffer) ? ? ? ? PorterDuff.Mode.LIGHTEN (framebuffer) ? ? ? ? PorterDuff.Mode.OVERLAY (framebuffer) ? ? ? ? Shader ComposeShader inside ComposeShader ? ? ? ? Same type shaders inside ComposeShader ? ? ? ? Local matrix on ComposeShader ? ? ? ?
以上就是硬件加速對於一些繪制行為在那些API等級上支持和不支持的列表,同樣的行為在不同的API等級平台上會有存在不同的情況,這是因為不同平台擁有不同的OpenGL版本。


控制硬件加速開關


引言中說過控制硬件加速可以在不同層級進行,這樣可以避免因為一個繪制動作不支持而導致整個應用都不可以使用硬件加速這樣很愚蠢的情況發生。總共有四個層級,從上到下是:

1. Application

應用程序等級控制硬件加速,在AndroidManifest.xml中進行:


在Android4.0以上(包含)默認就為true,即打開。如果整個應用都不想用硬件加速,則設定為false。


2. Activity

Activity等級的控制方法還是在AndroidManifest.xml中進行,如下展示了應用整體使用硬件加速,而某一個Activity不使用的例子:

    
    


3. Window

窗口級控制,如果只是想讓某個窗口使用硬件加速:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);


4. View

可以通過代碼在運行時控制單個View是否使用硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

LAYER_TYPE_HARDWARE即為使用硬件加速(GPU),LAYER_TYPE_SOFTWARE使用CPU進行繪制。


何時關閉?關閉誰?

可以通過

View.isHardwareAccelerated()

Canvas.isHardwareAccelerated()
檢測其是否在使用硬件加速。如果是自定義View,通過復寫onDraw改變Canvas內容,那麼最好的檢測Canvas而非View,即使一個View被放置到了使用硬件加速的Window中,View本身及Canvas仍然可以不使用硬件加速功能。所以,在合適的位置進行關閉,關閉該關閉的那個對象很重要。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved