關於android 手機硬件加速問題

關於安卓手機的硬件加速問題

分類: Android基礎  740人閱讀 評論(0) 收藏 舉報


最近聽同事討論硬件加速問題,完全不懂。於是乎,百度了下,原來從3.0開始,安卓開始支持硬件加速,手機自然是從4.0開始支持的了。而且配置方法一種是在代碼中配置硬件加速,這個也分很多個級別,在minifest中;一種方式是在手機的開發人員選項中啓用硬件加速,不過似乎只有google的nexus有這個選項,其它的手機都別屏蔽了。

硬件加速的官方文檔:http://developer.android.com/guide/topics/graphics/hardware-accel.html

開啓硬件加速有兩種大的途徑

1.在系統設置“開發人員……”中勾選啓用GPU加速

2.在應用程序中啓用硬件加速

目前遇到的問題有,啓用硬件加速後,WebView的性能受到一定影響,設置背景透明無效。

目前4.0的系統有硬件加速,之前的版本不太清楚。

我們來看怎樣在程序中啓用硬件加速

  1. if (VERSION.SDK_INT > VERSION_SDK_ELEVEN)
  2. {
  3. getWindow().setFlags(
  4. WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
  5. WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
  6. }

這是,Window級別的硬件加速就啓動了。

對於已經在系統設置項中開啓硬件加速,但是硬件加速會給應用程序帶來問題的情況,可以使用如下方法爲應用程序View級別取消硬件加速

  1. mView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);


這裏有篇非常棒的文章:

轉載時請註明出處和作者聯繫方式: http://mogoweb.net/archives/%E2%80%9Dhttp://mogoweb.net%E2%80%9D [email protected]

本文的主要內容來自SDK文章的"Hardware Acceleration”.

從Android 3.0開始,Android的2D渲染管線可以更好的支持硬件加速。硬件加速使用GPU進行View上的繪製操作。

硬件加速可以在一下四個級別開啓或關閉:

  • Application
  • Activity
  • Window
  • View

Application級別

往您的應用程序AndroidManifest.xml文件爲application標籤添加如下的屬性即可爲整個應用程序開啓硬件加速:

<application android:hardwareAccelerated="true" ...>

Activity級別

您還可以控制每個activity是否開啓硬件加速,只需在activity元素中添加android:hardwareAccelerated屬性即可辦到。比如下面的例子,在application級別開啓硬件加速,但在某個activity上關閉硬件加速。

<application android:hardwareAccelerated="true"> <activity ... /> <activity android:hardwareAccelerated="false" /></application>

Window級別

如果您需要更小粒度的控制,可以使用如下代碼開啓某個window的硬件加速:

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

注:目前還不能在window級別關閉硬件加速。

View級別

您可以在運行時用以下的代碼關閉單個view的硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

注:您不能在view級別開啓硬件加速

爲什麼需要這麼多級別的控制?

很明顯,硬件加速能夠帶來性能提升,android爲什麼要弄出這麼多級別的控制,而不是默認就是全部硬件加速呢?原因是並非所有的2D繪圖操作支持硬件加速,如果您的程序中使用了自定義視圖或者繪圖調用,程序可能會工作不正常。如果您的程序中只是用了標準的視圖和Drawable,放心大膽的開啓硬件加速吧!具體是哪些繪圖操作不支持硬件加速呢:

  • Canvas
    • clipPath()
    • clipRegion()
    • drawPicture()
    • drawPosText()
    • drawTextOnPath()
    • drawVertices()
  • Paint
    • setLinearText()
    • setMaskFilter()
    • setRasterizer()

另外還有一些繪圖操作,開啓和不開啓硬件加速,效果不一樣:

Android的繪製模型

開啓硬件加速後,Android框架將採用新的繪製模型。基於軟件的繪製模型和基於硬件的繪製模型有和不同呢?

基於軟件的繪製模型

在軟件繪製模型下,視圖按照如下兩個步驟繪製:

1. Invalidate the hierarchy(注:hierarchy怎麼翻譯?)

2. Draw the hierarchy

應用程序調用invalidate()更新UI的某一部分,失效(invalidation)消息將會在整個視圖層中傳遞,計算每個需要重繪的區域(即髒區域)。然後Android系統將會重繪所有和髒區域有交集的view。很明顯,這種繪圖模式存在缺點:

1. 每個繪製操作中會執行不必要的代碼。比如如果應用程序調用invalidate()重繪button,而button又位於另一個view之上,即使該view沒有變化,也會進行重繪。

2. 可能會掩蓋一些應用程序的bug。因爲android系統會重繪與髒區域有交集的view,所以view的內容可能會在沒有調用invalidate()的情況下重繪。這可能會導致一個view依賴於其它view的失效纔得到正確的行爲。

基於硬件的繪製模型

Android系統仍然使用invalidate()和draw()來繪製view,但在處理繪製上有所不同。Android系統記錄繪製命令到顯示列表,而不是立即執行繪製命令。另一個優化就是Android系統只需記錄和更新標記爲髒(通過invalidate())的view。新的繪製模型包含三個步驟:

1. Invalidate the hierarchy

2. 記錄和更新顯示列表

3. 繪製顯示列表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章