Android Force GPU渲染如何启用和禁用?

时间:2013-03-03 20:54:08

标签: android canvas gpu hardware-acceleration

我正在构建一个需要在画布上进行大量绘制的应用程序。我注意到应用程序在高分辨率设备(例如nexus 7)中有点滞后。我看到开发人员选项中有一个Force GPU选项。启用强制GPU后,我的应用程序运行得非常流畅。

我已经读过,这个Force GPU选项被称为硬件加速,它仅适用于Android 3.0及更高版本。

我的应用程序定位到Android 2.3及更高版本。

是否可以在任何Android 3.0或更高版本的设备上以编程方式启用硬件加速(或强制GPU - 无论魔法是什么)?

类似的东西:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){

    Turn On Hardware Accelerate HERE but How can i do this?
    any code snippet would be welcome/helpful/thanks

}

3 个答案:

答案 0 :(得分:7)

我假设你已经将android:hardwareAccelerated添加到你的Manifest文件中了?

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

这就是在应用程序中按the guide on hardware acceleration启用硬件加速的原因,并且应该完全按照强制GPU在系统级别执行的操作。

答案 1 :(得分:4)

将minSdkVersion设置为10,将targetSdkVersion设置为最大值

如下所示

 <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="17" />

然后

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

现在可行了

特殊性

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB){
     view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB){
     view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

答案 2 :(得分:0)

如果您想使用较低的api级别构建应用程序,可以通过反射访问该方法:

    try {
        Method setLayerType = view.getClass().getMethod(
                "setLayerType", new Class[] { int.class, Paint.class });
        if (setLayerType != null)
            setLayerType.invoke(view, new Object[] { LAYER_TYPE_X, null });
    } catch (NoSuchMethodException e) {
    } catch (IllegalArgumentException e) {
    } catch (IllegalAccessException e) {
    } catch (InvocationTargetException e) {
    }

其中LAYER_TYPE_X是所需图层类型的常量整数值:

LAYER_TYPE_NONE = 0
LAYER_TYPE_SOFTWARE = 1
LAYER_TYPE_HARDWARE = 2