硬件加速

Posted by OOFTF Blog on May 3, 2021

硬件加速

从 Android 3.0(API 级别 11)开始,Android 2D 渲染管道支持硬件加速,也就是说,在 View 的画布上执行的所有绘制操作都会使用 GPU。启用硬件加速需要更多资源,因此应用会占用更多内存。

如果您的目标 API 级别为 14 及更高级别,则硬件加速默认处于启用状态,但也可以明确启用该功能。

如果您的应用仅使用标准视图和 Drawable,则全局启用硬件加速不会造成任何不良绘制效果。

不过,并非所有 2D 绘制操作都支持硬件加速,因此启用硬件加速可能会影响您的部分自定义视图或绘制调用。具体问题通常以不可见的元素、异常或错误渲染的像素显现。为了解决此问题,Android 允许您在多个级别选择是启用还是停用硬件加速。

控制硬件加速

您可以在以下级别控制硬件加速:

  • 应用
  • Activity
  • Window
  • View

应用级别

在 Android 清单文件中,将以下属性添加到 标记中,为整个应用启用硬件加速:

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

Activity 级别

如果全局启用硬件加速后,您的应用无法正常运行,则您也可以针对各个 Activity 控制硬件加速。要在 Activity 级别启用或停用硬件加速,您可以使用 元素的 android:hardwareAccelerated 属性。以下示例展示了如何为整个应用启用硬件加速,但为一个 Activity 停用硬件加速:

1
2
3
4
5
    <application android:hardwareAccelerated="true">
        <activity ... />
        <activity android:hardwareAccelerated="false" />
    </application>
    

Window

如果您需要实现更精细的控制,可以使用以下代码为给定窗口启用硬件加速:

1
2
3
4
5
    window.setFlags(
            WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
            WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
    )
    

Vieew

您可以使用以下代码在运行时为单个视图停用硬件加速:

1
    myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

硬件加速受支持的API级别

画布

画布缩放

提示和技巧

切换到硬件加速的 2D 图形可立即提升性能,但您仍应按照以下建议设计应用,以便有效利用 GPU:

  • 减少应用中的视图数量
    系统需要绘制的视图越多,运行速度越慢。这也适用于软件渲染管道。减少视图是优化界面最简单的方法之一。
  • 避免过度绘制
    请勿在彼此上方绘制过多层。移除所有被上方的其他不透明视图完全遮挡的视图。如果您需要在彼此上方混合绘制多个层,请考虑将它们合并为一个层。对于目前的硬件来说,绘制的层数最好不超过屏幕上每帧像素数的 2.5 倍(透明像素,以位图计数!)。
  • 请勿在绘制方法中创建渲染对象
    一个常见的错误是,每次调用渲染方法时都创建新的 Paint 或 Path。这会强制垃圾回收器更频繁地运行,同时还会绕过硬件管道中的缓存和优化。
  • 请勿过于频繁地修改形状
    例如,使用纹理遮罩渲染复杂的形状、路径和圆圈。每次创建或修改路径时,硬件管道都会创建新的遮罩,成本可能比较高。
  • 请勿过于频繁地修改位图
    每次更改位图的内容时,系统都会在您下次绘制时将其作为 GPU 纹理再次上传。
  • 谨慎使用 Alpha
    当您使用 setAlpha()、AlphaAnimation 或 ObjectAnimator 将视图设置为半透明时,该视图会在屏幕外缓冲区渲染,导致所需的填充率翻倍。在超大视图上应用 Alpha 时,请考虑将视图的层类型设置为 LAYER_TYPE_HARDWARE。