Android硬件加速
什么是硬件加速?
从 Android 3.0(API 级别 11)开始,Android 2D 渲染管道支持硬件加速,也就是说,在 View的画布上执行的所有绘制操作都会使用 GPU。启用硬件加速需要更多资源,因此应用会占用更多内存。
如果您的目标 API 级别为 14 及更高级别,则硬件加速默认处于启用状态,但也可以明确启用该功能。不过,并非所有 2D 绘制操作都支持硬件加速,因此启用硬件加速可能会影响您的部分自定义视图或绘制调用。
基于软件的绘制模型
在软件绘制模型中,绘制视图分为以下两步:
- 对层次结构进行无效化处理
- 绘制层次结构
每当应用需要更新其界面的一部分时,就会对内容已发生更改的所有视图调用invalidate()(或其变体之一)。无效化消息会一直传播到视图层次结构上层,以计算需要重新绘制的屏幕区域(脏区域)。然后,Android 系统会绘制层次结构中与脏区域交互的所有视图。遗憾的是,这种绘制模型具有以下两个缺点:
- 第一,每次绘制时该模型都需要执行大量代码。例如,如果您的应用对某个按钮调用invalidate() 且该按钮位于另一个视图上方,那么即使该视图未发生更改,Android 系统仍会重新绘制该视图。
- 第二,该绘制模型会隐藏应用中的错误。由于 Android 系统会在视图与脏区域交互时重新绘制视图,因此系统可能会重新绘制内容发生更改的视图,即使未对其调用invalidate()也是如此。如果发生这种情况,您要依赖其他经过无效化处理的视图才能获得正确的行为。每次修改应用时,此行为都可能会发生更改。因此,每次修改会影响视图绘制代码的数据或状态后,您都要对自定义视图调用invalidate()。
基于硬件加速的绘制模型
Android系统仍然使用invalidate()和draw()来请求屏幕更新和渲染视图,但是以不同的方式处理实际的图形。 Android系统不是立即执行绘图命令,而是将它们记录在包含视图层次结构的绘图代码输出的显示列表中。另一个优化是Android系统只需要记录和更新由invalidate()调用标记为脏的视图的显示列表。没有失效的视图可以通过重新发布之前记录的显示列表重新绘制。新的绘图模型包含三个阶段:
1.使层次结构无效
2.记录和更新显示列表
3.绘制显示列表
开启硬件加速,可以提高程序的绘制效率,提高内容改变时的刷新效率。但是硬件加速不是有百利而无一害的,它还是有它所限制的地方。受到GPU绘制方式的限制,Canvas有些方法在硬件加速开启的时候会失效或者无法正常工作。
软件绘制与硬件加入对比:
如果硬件加速不支持或者被关闭,则使用软件绘制,生成的Canvas即Canvas.class的对象;
如果支持硬件加速,则生成的是DisplayListCanvas.class的对象;
怎么开硬件加速?
控制硬件加速有四个级别:
1.Application
2.Activity
3.Window
4.View
在这四个层次中,应用和Activity是可以选择的开启或关闭,Window只能打开,View只能关闭。
Application开启硬件加速方式:
<application
android:hardwareAccelerated="true">
Activity开启硬件加速:
如果全局启用硬件加速后,您的应用无法正常运行,则您也可以针对各个 Activity 控制硬件加速。要在 Activity 级别启用或停用硬件加速,您可以使用activity元素的 android:hardwareAccelerated
属性。
//activity开硬件加速
<activity android:name=""
android:hardwareAccelerated="true"/>
//activity关硬件加速
<application android:hardwareAccelerated="true">
<activity android:hardwareAccelerated="false" />
</application>
Window开启硬件加速方式:
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
View关闭硬件加速:
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
注意:您目前无法在View级别启用硬件加速。
确定视图是否经过硬件加速:
View.isHardwareAccelerated()
Canvas.isHardwareAccelerated()
参考:
Android官网——硬件加速