从 Android 3.0(API 级别 11)开始,Android 2D 渲染管道支持硬件加速,也就是说,在

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

如果您的应用执行自定义绘制,请在启用硬件加速的实际硬件设备上测试应用,以检查是否存在任何问题。不受支持的绘制操作部分介绍了已知硬件加速问题和相应的解决方案。

控制硬件加速

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

应用

Activity

窗口

视图

应用级别

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

Activity 级别

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

窗口级别

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

Kotlin

window.setFlags(

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED

)Java

getWindow().setFlags(

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,

WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

注意:您目前无法在窗口级别停用硬件加速。

视图级别

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

Kotlin

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)Java

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

注意:您目前无法在视图级别启用硬件加速。除了停用硬件加速之外,视图层还具有其他功能。如需详细了解视图层的具体用途,请参阅视图层。

确定视图是否经过硬件加速

有时,应用有必要了解当前是否经过硬件加速,尤其是对于自定义视图等内容。如果您的应用执行大量自定义绘制,但并非所有操作都得到新渲染管道的正确支持,这就会特别有用。

您可以通过以下两种不同的方式检查应用是否经过硬件加速。

如果您必须在绘制代码中执行这项检查,请尽可能使用

Android 绘制模型

启用硬件加速后,Android 框架会采用新的绘制模型,该模型利用显示列表将您的应用渲染到屏幕上。要充分了解显示列表以及它们可能如何影响您的应用,最好再了解一下 Android 如何在不启用硬件加速的情况下绘制视图。下面几部分介绍了基于软件的绘制模型和硬件加速绘制模型。

基于软件的绘制模型

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

对层次结构进行无效化处理

绘制层次结构

每当应用需要更新其界面的一部分时,就会对内容已发生更改的所有视图调用

第一,每次绘制时该模型都需要执行大量代码。例如,如果您的应用对某个按钮调用

第二,该绘制模型会隐藏应用中的错误。由于 Android 系统会在视图与脏区域交互时重新绘制视图,因此系统可能会重新绘制内容发生更改的视图,即使未对其调用

注意:Android 视图会在其属性(例如

硬件加速绘制模型

Android 系统仍会使用

对层次结构进行无效化处理

记录并更新显示列表

绘制显示列表

使用此模型时,您无法依赖与脏区域交互的视图来执行其

使用显示列表还有助于改进动画性能,因为设置特定属性(例如 Alpha 或旋转)不需要对目标视图进行无效化处理(该操作是自动完成的)。这项优化还适用于具有显示列表的视图(如果应用经过硬件加速,则适用于所有视图)。例如,假设有一个

DrawDisplayList(ListView)

DrawDisplayList(Button)

假设您现在要更改 setAlpha(0.5f) 后,显示列表现在包含以下内容:

SaveLayerAlpha(0.5)

DrawDisplayList(ListView)

Restore

DrawDisplayList(Button)

系统没有执行

不受支持的绘制操作

经过硬件加速后,2D 渲染管道支持最常用的

下表介绍了各种操作在各个 API 级别的支持级别:

第一个支持的 API 级别

Canvas

drawBitmapMesh()(颜色数组)

18

drawPicture()

23

drawPosText()

16

drawTextOnPath()

16

drawVertices()

setDrawFilter()

16

clipPath()

18

clipRegion()

18

clipRect(Region.Op.XOR)

18

clipRect(Region.Op.Difference)

18

clipRect(Region.Op.ReverseDifference)

18

clipRect()(通过旋转/透视)

18

Paint

setAntiAlias()(适用于文本)

18

setAntiAlias()(适用于线条)

16

setFilterBitmap()

17

setLinearText()

setMaskFilter()

setPathEffect()(适用于线条)

28

setShadowLayer()(除文本之外)

28

setStrokeCap()(适用于线条)

18

setStrokeCap()(适用于点)

19

setSubpixelText()

28

Xfermode

PorterDuff.Mode.DARKEN(帧缓冲区)

28

PorterDuff.Mode.LIGHTEN(帧缓冲区)

28

PorterDuff.Mode.OVERLAY(帧缓冲区)

28

Shader

ComposeShader 内的 ComposeShader

28

ComposeShader 内相同类型的着色器

28

ComposeShader 上的本地矩阵

18

画布缩放

硬件加速 2D 渲染管道最初是为了支持不可缩放的绘制构建的,其中一些绘制操作会以较高的缩放值显著降低质量。这些操作实现为按 1.0 的缩放值绘制的纹理,由 GPU 进行转换。从 API 级别 28 开始,所有绘制操作都可以顺利缩放。

下表列出了何时更改实现以正确处理大规模缩放:

要缩放的绘制操作

第一个支持的 API 级别

drawText()

18

drawPosText()

28

drawTextOnPath()

28

简单的形状*

17

复杂的形状*

28

drawPath()

28

阴影层

28

注意:“简单”形状指的是使用 Paint 发出的 drawRect()、drawCircle()、drawOval()、drawRoundRect() 和 drawArc()(其中 useCenter=false)命令,该 Paint 不包含 PathEffect,也不包含非默认联接(通过 setStrokeJoin()/setStrokeMiter())。这些绘制命令的其他实例都属于上表中的“复杂”形状。

如果缺失以上任意功能或限制会对您的应用造成影响,您可以调用 控制硬件加速。

视图层

在所有 Android 版本中,视图能够通过以下两种方式渲染到屏幕外缓冲区:使用视图的绘制缓存或使用 Canvas.saveLayer() 实现淡入淡出效果,以将视图暂时渲染到层,然后使用不透明度系数将其合成回屏幕上。

从 Android 3.0(API 级别 11)开始,您可以通过

要使用何种层类型取决于您的目标:

性能:使用硬件层类型可将视图渲染为硬件纹理。将视图渲染为层后,在该视图调用

视觉效果:使用硬件层或软件层类型和

兼容性:使用软件层类型可强制在软件中渲染视图。如果经过硬件加速的视图(例如,如果整个应用都经过硬件加速)遇到渲染问题,采用这种方法可轻松解决硬件渲染管道的局限性。

视图层和动画

如果应用经过硬件加速,硬件层能够提供更快且更顺畅的动画。在为需要发出大量绘制操作的复杂视图添加动画效果时,以 60 帧/秒的速度运行动画并非总能实现。使用硬件层将视图渲染为硬件纹理可在一定程度上解决此问题。然后,硬件纹理可用于为视图添加动画效果,这样视图在动画效果添加过程中无需不断自行重新绘制。除非您更改视图的属性(这会调用

如果视图由硬件层提供支持,则其部分属性可通过在屏幕上合成层的方式处理。设置这些属性有助于提高效率,因为它们不需要先对视图进行无效化处理后再重新绘制。下面列出的属性会影响层的合成方式。针对以下任何属性调用 setter 方法会得到最佳无效化效果,且无需重新绘制目标视图:

alpha:更改层的不透明度

x、y、translationX、translationY:更改层的位置

scaleX、scaleY:更改层的大小

rotation、rotationX、rotationY:更改层在 3D 空间里的方向

pivotX、pivotY:更改层的转换原点

这些是使用

Kotlin

view.setLayerType(View.LAYER_TYPE_HARDWARE, null)

ObjectAnimator.ofFloat(view, "rotationY", 180f).start()Java

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);

ObjectAnimator.ofFloat(view, "rotationY", 180).start();

由于硬件层会占用视频内存,因此强烈建议您仅在动画播放期间启用,然后在动画结束后停用。您可以使用动画监听器完成此操作:

Kotlin

view.setLayerType(View.LAYER_TYPE_HARDWARE, null)

ObjectAnimator.ofFloat(view, "rotationY", 180f).apply {

addListener(object : AnimatorListenerAdapter() {

override fun onAnimationEnd(animation: Animator) {

view.setLayerType(View.LAYER_TYPE_NONE, null)

}

})

start()

}Java

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);

ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);

animator.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationEnd(Animator animation) {

view.setLayerType(View.LAYER_TYPE_NONE, null);

}

});

animator.start();

如需详细了解属性动画,请参阅属性动画。

提示和技巧

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

减少应用中的视图数量

系统需要绘制的视图越多,运行速度越慢。这也适用于软件渲染管道。减少视图是优化界面最简单的方法之一。

避免过度绘制

请勿在彼此上方绘制过多层。移除所有被上方的其他不透明视图完全遮挡的视图。如果您需要在彼此上方混合绘制多个层,请考虑将它们合并为一个层。对于目前的硬件来说,绘制的层数最好不超过屏幕上每帧像素数的 2.5 倍(透明像素,以位图计数!)。

请勿在绘制方法中创建渲染对象

一个常见的错误是,每次调用渲染方法时都创建新的

请勿过于频繁地修改形状

例如,使用纹理遮罩渲染复杂的形状、路径和圆圈。每次创建或修改路径时,硬件管道都会创建新的遮罩,成本可能比较高。

请勿过于频繁地修改位图

每次更改位图的内容时,系统都会在您下次绘制时将其作为 GPU 纹理再次上传。

谨慎使用 Alpha

当您使用 LAYER_TYPE_HARDWARE。

安卓禁用硬件加速_硬件加速  |  Android 开发者  |  Android Developers相关推荐

  1. audio unity 加速_浅谈Unity中Android、iOS音频延迟

    在Unity上面做音游,当在移动端实机运行起来,会发现,音频的发出会有一定的延迟,无论是长音效还是短音效,Unity内置的Audio内部使用的是FMOD,有以下手段改善 通过设置稍微改善其延迟的问题 ...

  2. 拼写检查工具是android,拼写检查工具框架  |  Android 开发者  |  Android Developers...

    Android 平台提供了拼写检查工具框架,可让您在应用中实现和使用拼写检查功能.该框架是 Android 平台提供的文本服务 API 之一. 如需在您的应用中使用该框架,您需要创建一个特殊类型的 A ...

  3. android 视频预览,预览视频  |  Android 开发者  |  Android Developers

    如需鼓励用户访问您的 TV 应用中的深层链接,预览视频是一种不错的方法. 预览内容可以是简短的视频剪辑,也可以是完整的电影预告片. 在创建预览时,请注意以下准则: 不要在预览中显示广告.如果您在客户端 ...

  4. 侠义java加速_侠义加速版下载-侠义加速版游戏下载v1.7 安卓版-单机手游网

    侠义加速版是一款经典的复古武侠手游,游戏完美还原了一个武侠世界该有的一切东西,带你体验武侠江湖的恩怨情仇,丰富的玩法模式让你爱不释手,全方位的战力提升系统助你突破巅峰.喜欢这款游戏的小伙伴们快来单机1 ...

  5. 产品硬件成本分析_硬件项目中的错误成本

    产品硬件成本分析 Hello everyone! 大家好! In this article, we will consider common errors in the design of elect ...

  6. python硬件驱动_硬件驱动python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! linux获取linux硬件信息的方式,有很多. 1.使用puppet或者sal ...

  7. java 汽车加速_汽车加速没劲怎么办?四个简单的方法教你提升汽车动力!

    大家在买车时肯定会在底下做好功课,自己心里想要选购什么样的车,比如汽车的配置.价钱.两厢还是三厢车等等,不过大家最关注的应该也就是汽车的动力吧,有很多车主反映自己的汽车驾驶了一段后觉得加速无力,典型的 ...

  8. 李洪超 硬件工程师_硬件工程师必阅--如何“0基础”从入门到精通?(附CAD使用指南)...

    作为一个好的硬件工程师实际上就是一个项目经理,你需要从外界交流获取对自己设计的需求,然后汇总,分析成具体的硬件实现.那么需要哪些具体的技能呢? 掌握硬件总体设计所必须具备的硬件设计经验与设计思路 1) ...

  9. 安卓java增加属性_如何使用Java读取Android属性

    我在终端中使用'adb shell getprop'. 我可以在Android JAVA中使用哪些接口来获取相同的信息? 我尝试过几样的事情: Properties sysProps = System ...

最新文章

  1. 拍拍网t恤DIY效果
  2. UVa719 Glass Bread(后缀数组解法)
  3. SQL查询案例:行列转换[行转列, 使用 CASE WHEN 处理]
  4. 构造函数中不应调用虚函数
  5. C语言字符串怎么算char字符,计算C中字符串中char的出现次数
  6. 多线程之线程池-各个参数的含义- 阿里,美团,京东面试题目
  7. Maven精选系列--继承与聚合
  8. 大学英语期末考计算机上答卷,英语期末考试总结范文(精选5篇)
  9. Servlet JSP和Spring MVC初学指南 PDF
  10. Mysql数据库drop表不用跑路,表空间传输助你恢复数据
  11. win10 安装低版本的 .net framework
  12. WinRAR 5.40无弹窗广告注册版下载
  13. 最全ListView扩展的实例和补充
  14. 图文手把手教程--ESP32 MQTT对接EMQX本地服务器(VSCODE+ESP-IDF)
  15. 改(微微微微微小说)
  16. Sprite Renderer
  17. 工程技术开发的圈套与局限性
  18. 1225 D. Power Products 哈希
  19. 转贴(电脑报):VBA开发实用指南
  20. 跨越2009之华为总裁任正非

热门文章

  1. 插值算法 —— Lerp, NLerp, SLerp
  2. 广东一只名叫“大壮“的猫会葛优躺,难道它也内卷了?
  3. hbuilder html id,Hbuilder常用功能汇总(示例代码)
  4. 上海布局“元宇宙”新赛道,发力点在哪里?《元宇宙十大技术》作者、元宇宙产业委李安民主任:这项技术是核心
  5. 新手入门百度地图开发的(0,0)坐标问题
  6. touch用来修改文件时间戳,或者新建一个不存在的文件
  7. .ipynb文件是什么,如何打开?
  8. floodlight java_Floodlight-Main.java 分析
  9. 猴子吃桃问题 C语言用递归实现
  10. windows命令行下:telnet访问163邮箱服务器和qq邮箱服务器发送邮件