【问题标题】:Android Force GPU Rendering How to enable and disable?Android Force GPU Rendering 如何启用和禁用?
【发布时间】:2013-02-17 21:39:21
【问题描述】:

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

}

【问题讨论】:

  • 对不起,我在 android 2.3 api 10 上构建我的应用程序,所以它实际上没有 或 getWindow().setFlags (WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
  • 您是否在 onCreate 中添加了抑制功能?
  • 请将您的构建目标设置为 API 级别 11 或更高,然后使用android:hardwareAccelerated="true"
  • 如果我将构建目标设置为 API 级别 11,那么我将无法支持 API 级别 10 设备...我希望仍然能够支持 API 10...跨度>
  • wtsang02,我尝试了您的代码,但由于 WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED 在 api 10 中不可用

标签: android canvas gpu hardware-acceleration


【解决方案1】:

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

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

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

【讨论】:

  • 我的应用使用 android 2.3 api 10,它没有 android:hardwareAccelerated,所以它抱怨“在包 'android' 中找不到属性 'hardwareAccelerated' 的资源标识符”
  • 您可以构建和定位不同的 API 级别。针对 API 11+ 构建并将您的最低 SDK 保持在 10。
  • ianhanniballake,您是说我可以使用最新的 api(11) 构建我的应用程序并使其在较低的 api 设备中仍可运行?这是否意味着我只需要将我的 android 项目目标升级到最新的 api?
  • 完全正确。是 Manifest 中的 android:minSdkVersion 控制它将在哪些设备上运行,而不是您构建的设备。这允许您在保持向后兼容的同时使用新的 API。当然,您仍然需要在任何方法调用之前进行版本检查,但在这种情况下,hardwareAccelerated XML 属性在之前的 Honeycomb 设备上会被忽略。
  • 啊,我要试一试...感谢您的评论
【解决方案2】:

将 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);
}

【讨论】:

    【解决方案3】:

    如果您想使用较低的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2020-08-29
      • 2014-04-27
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      相关资源
      最近更新 更多