学习学习之鸿蒙&AndroidAndroid开发

Android硬件加速

2021-07-10  本文已影响0人  奔跑吧李博

什么是硬件加速?

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

如果您的目标 API 级别为 14 及更高级别,则硬件加速默认处于启用状态,但也可以明确启用该功能。不过,并非所有 2D 绘制操作都支持硬件加速,因此启用硬件加速可能会影响您的部分自定义视图或绘制调用。

基于软件的绘制模型

在软件绘制模型中,绘制视图分为以下两步:

  1. 对层次结构进行无效化处理
  2. 绘制层次结构

每当应用需要更新其界面的一部分时,就会对内容已发生更改的所有视图调用invalidate()(或其变体之一)。无效化消息会一直传播到视图层次结构上层,以计算需要重新绘制的屏幕区域(脏区域)。然后,Android 系统会绘制层次结构中与脏区域交互的所有视图。遗憾的是,这种绘制模型具有以下两个缺点:

基于硬件加速的绘制模型

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官网——硬件加速

上一篇下一篇

猜你喜欢

热点阅读