【Android】 硬件加速(hardwareAccelerated)可能導致的問題


Android 3.0(API level 11),開始支持所有的視圖的畫布都將使用GPU,但是是硬件的加速會佔用一定的RAM。在API> = 14上,默認是開啟的,如果你的應用只是標準的View和可拉伸,全局都打開硬件加速,是不會有任何問題的。

然而,硬件加速並不支持所有的2D畫圖的操作,這時開著它,可能會影響到你的自定義控件或者繪畫,出現異常等行為,所以的android對於硬件加速提供了可選性如果你的應用執行了自定義的繪畫,可以通過在真機上測試開啟硬件加速查找問題。

在Android 4.0的某些設備上,在View刷新時會出現花屏和屏幕上的某些查看錯位的現象。經過調查後發現adb logcat中出現很多OpenGLRenderer: 0x501的錯位:


類似以下的log
 
    09-18 14:34:39.090: DEBUG/OpenGLRenderer(3104): GL error from OpenGLRenderer: 0x501
    09-18 14:34:39.386: DEBUG/OpenGLRenderer(3104): GL error from OpenGLRenderer: 0x501
    09-18 14:34:39.656: DEBUG/OpenGLRenderer(3104): GL error from OpenGLRenderer: 0x501
 
從這個日誌,初步懷疑是硬件加速導致的問題。經過分析發現使用比較複雜的自定義View,可能會導致硬件加速渲染出錯。


硬件加速的優點與缺點
        硬件加速能使用GPU來加速2D圖像的渲染速度,但是硬件加速並不能完全支持所有的渲染操作,針對自定義的View,硬件加速可能導致渲染出現錯誤。如果有自定義的View,需要在硬件加速的設備上進行測試,如果出現渲染的問題,需要關閉硬件加速。

開啟和關閉硬件加速
對硬件加速的開關可以在不同的級別進行控制:

  • 應用
  • 活動
  • 視窗
  • 視圖

應用級別
在Applciation級別控制硬件加速的開關:
 
    <application android:hardwareAccelerated="true" ...>
 

活動級別
對可以單個的Activity控制是否啟用硬件加速:
 
    <application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
    </application>
 

視窗級別
 
    getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
 

查看級別
在指定的視圖上關閉硬件加速:
 
    myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
 

使用或者android:layerType="software"來關閉硬件加速:
 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:paddingLeft="2dp"
    android:layerType="software"
    android:paddingRight="2dp" >
 

如何判斷一個查看是否啟用了硬件加速
View.isHardwareAccelerated() 如果視圖連接到硬件加速窗口,則返回true。
Canvas.isHardwareAccelerated() 如果畫布硬件加速,則返回true



沒有留言:

張貼留言