11

我正在构建一个需要在画布上进行大量绘图的应用程序。我注意到该应用程序在高分辨率设备(例如nexus 7)中有点滞后。我看到开发人员选项中有一个 Force GPU 选项。启用 Force 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

}
4

3 回答 3

7

我假设您已经将 android:hardwareAccelerated 添加到您的清单文件中?

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

这就是根据硬件加速指南在您的应用程序中启用硬件加速的原因,并且应该完全按照强制 GPU 在系统级别执行的操作。

于 2013-03-03T20:59:20.803 回答
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);
}
于 2013-03-22T09:17:37.473 回答
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
于 2013-12-04T19:04:30.233 回答