硬件加速
从 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 级别启用或停用硬件加速,您可以使用
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。