我正在构建一个需要在画布上进行大量绘制的应用程序。我注意到应用程序在高分辨率设备(例如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
}
答案 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