Android的硬件加速及可能導(dǎo)致的問題
問題
在Android 4.0的某些設(shè)備上,在View刷新時會出現(xiàn)花屏和屏幕上的某些View錯位的現(xiàn)象。 經(jīng)過調(diào)查后發(fā)現(xiàn)adb logcat
中出現(xiàn)很多OpenGLRenderer: 0x501
的錯位:
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
從這個日志,初步懷疑是硬件加速導(dǎo)致的問題。 經(jīng)過分析發(fā)現(xiàn)使用了比較復(fù)雜的自定義View,可能會導(dǎo)致硬件加速渲染出錯。
硬件加速的優(yōu)點與缺點
硬件加速能使用GPU來加速2D圖像的渲染速度,但是硬件加速并不能完全支持所有的渲染操作, 針對自定義的View,硬件加速可能導(dǎo)致渲染出現(xiàn)錯誤。 如果有自定義的View,需要在硬件加速的設(shè)備上進(jìn)行測試,如果出現(xiàn)渲染的問題,需要關(guān)閉硬件加速。
開啟和關(guān)閉硬件加速
對硬件加速的開關(guān)可以在不同的級別進(jìn)行控制:
- Application
- Activity
- Windows
- View
1. Application級別
在Applciation級別控制硬件加速的開關(guān)
<application android:hardwareAccelerated="true" ...>
2. Activity級別
可以對單個的Activity控制是否啟用硬件加速:
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
3. Window級別
在指定的View上關(guān)閉硬件加速:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
或者使用android:layerType="software"
來關(guān)閉硬件加速:
<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是否啟用了硬件加速
View.isHardwareAccelerated()
returns true if the View is attached to a hardware accelerated window.
Canvas.isHardwareAccelerated()
returns true if the Canvas is hardware accelerated
參考:http://developer.android.com/guide/topics/graphics/hardware-accel.html