`
djun100
  • 浏览: 165582 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

教你更好的使用硬件加速

 
阅读更多

原文:Hardware Acceleration
翻译:D.Winter

从Android 3.0 (API level 11)开始,Android 2D渲染管线能更好的支持硬件加速。硬件加速通过GPU执行各种绘画操作。因为硬件加速需要消耗更多的资源,所以你的App需要更多的RAM。
开启硬件加速最简单的方法是在整个应用全局设置。如果应用只使用标准的ViewDrawable,全局设置不会产生不利的影响。然而,因为硬件加速不支持所有的2D绘制操作,开启会影响一些自定义View或者绘制调用。问题显示为不可见的元素、异常,或者错误渲染像素。为了补救这些,Android提供给你选项开启或者关闭硬件加速在以下几个层面:
* Application
* Activity
* Window
* View

如果你的应用执行自定义绘制,开启硬件加速,测试应用在实际的硬件设备上去查找问题。

* 控制硬件加速*

你可以在以下层面控制硬件加速
* Application
* Activity
* Window
* View

Application 层

在你的Android manifest文件里,添加以下属性到标签里,针对整个应用开启硬件加速:

Activity 层

如果整个应用开启硬件加速表现的不稳定,你也可以针对单个Activity进行控制。在Activity层开启或者关闭硬件加速,你可以使用android:hardwareAccelerated属性在标签内。下面是单个Activity中关闭硬件加速的例子:




Window 层

如果你需要更细致的控制,可以在获得的Window里开启硬件加速:

getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);


* 注: 在window层不能取消硬件加速。

View 层

通过下面代码,你可以在运行时关闭硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);


注:你不能在view层开启硬件加速。 View面板有其他方法关闭硬件加速。更多详细内容请看View layers|View面板。

* 判断View是否已经硬件加速*

有时候,知道一个应用当前是否硬件加速是非常有用的,尤其像自定义View。这非常有用,当你的应用做大量的自定义绘制并且不是所有操作都支持新的渲染管道。

有两个方法查看应用是否硬件加速:

* Android绘画模型*

当开启硬件加速,新的绘画模型利用显示列表在界面上渲染你的应用。
为了完全理解显示列表和对你的应用有怎样的影响,知道Android不通过硬件加速怎么样绘制View也很重要。下面的篇章阐述基于软件和基于硬件的绘画模型。

* 基于软件的绘画模型*

在软件绘画模型中,View通过以下两个步骤被绘制:

  • 使层次失效
  • 绘制层次

每当应用需要更新部分UI时,调用invalidate()(或者它的变形)在任意需要改变内容的view里。这些失效信息被传播始终在view层,计算需要重绘的界面区域。然后,Android系统绘制任意view在这些区域。不幸的是,这种模型有两个缺点:
* 第一,这种模型需要执行的大量的代码在每一次绘画。比如,如果你的应用在按钮里调用了invalidate(),而且这个按钮在另外一个view之上,此时Android系统会重绘这个view,即时它没有发生改变。
* 第二个问题是绘画模型会隐藏你应用的错误。从Android系统开始重绘view,当他们与脏区域融合时,你改变的view的内容可能会被重绘即时invalidate()没有被调用。此时,你依赖于另外一个view使之失效来达到合适的反应。这个反应会在任何时候改变在你修改你的应用时。因此,你需要一直调用invalidate()在你的自定义view上,无论你修改数据或者影响你view绘画代码的声明。

注: Android view当它的属性改变时,自动调用invalidate(),比如背景颜色或者文本框内容。

* 基于硬件的绘画模型*

Android仍使用invalidate()和draw()来响应界面更新和视图渲染,不同的是控制当前绘制。Android系统将他们记录在显示列表来代替马上执行绘画命令,它包含view层绘画代码的输出。另外一个优化是Android系统只需对记录和更新显示列表,通过调用invalidate()将view标记为。
还没失效的View通过重新运行之前的记录显示列表被重绘。这个新绘画模型包括三个阶段:

  • 1、层失效
  • 2、记录更新显示列表
  • 3、绘画显示列表

用此模式,你不能依赖与脏区域交叉的view来执行它的draw()。为了确保Android系统记录一个View的显示列表,你必须调用invalidate()
忘记这么做会导致视图看起来一样,甚至在改变它后。一旦发生,这个BUG很容易被发现。

使用显示列表也利于动画增强,因为设置特殊的属性,像透明度和旋转, 不需要使目标视图失效(它自动完成)。这个优化也适用于显示列表的视图 (你应用的任一视图都硬件加速) 比如,假设有个LinearLayoutButton上有个ListView。LinearLayout的显示列表看上去这样:

DrawDisplayList(ListView)
DrawDisplayList(Button)
假设你现在要改变ListView的不透明,在调用setAlpha(0.5f)后,显示列表变成:
SaveLayerAlpha(0.5)
DrawDisplayList(ListView)
Restore
DrawDisplayList(Button)
ListView的设置代码没有被执行。系统只更新显示列表中更简单的LinearLayout。

在未开启硬件加速的应用中,列表的绘制代码在其父亲中还会被执行一次。

* 不支持的绘画操作*

当启动硬件加速, 2D渲染通道支持一般使用的画布绘画操作和一些较少使用的操作。所有的绘画操作被用于渲染程序,默认为widget和layout,还有些高级应用比如反光和纹理平铺也是被支持的。下面是不被硬件加速的操作清单:

另外, 有些操作在硬件加速开启后会发生变化:

如果你的应用受缺失属性和限制的影响,你可以关闭硬件加速,在你受影响的部分调用[android.graphics.Paint) setLayerType(View.LAYER_TYPE_SOFTWARE, null)](http://docs.eoeandroid.com/reference/android/view/View.html#setLayerTypeint,)( 。这个方法, 你仍可以利用硬件加速其他任一地方。查看Controlling Hardware Acceleration得到关于硬件加速的更多信息。

* View 层*

在Android的不同版本, view已经有能力渲染进入屏幕缓存区内,无论是view的绘制缓存,还是使用[android.graphics.Paint, int) Canvas.saveLayer()](http://docs.eoeandroid.com/reference/android/graphics/Canvas.html#saveLayerandroid.graphics.RectF,)。屏幕缓存,或层,有多种用途。你可以使用他们获得更好的性能,当动画组合视图或者需要应用复合效应。比如,你可以使用Canvas.saveLayer)来实现消退效果来临时渲染一个view进入层,然后使用opacity( factor合成到界面。

Android 3.0 (API level 11)开始,你有更多的控制通过[android.graphics.Paint) View.setLayerType()](http://docs.eoeandroid.com/reference/android/view/View.html#setLayerTypeint,)方法,怎样或者什么时候使用layers。这个API有2个参数:layer的类型和可选的[Paint]http://docs.eoeandroid.com/reference/android/graphics/Paint.html)对象,它阐明layer怎么样合成。(
你可以使用Paint参数使用滤色镜,特殊的混合模式,或者设置为不透明。view可以使用三种layer类型的其中一种:

The type of layer you use depends on your goal:

    • Performance* : 由硬件渲染到硬件纹理,一旦View被渲染到layer,它的绘图代码不会被执行直到调用invalidate()。有些动画,像透明度动画,直接放入layer,由GPU完成非常有效率。
    • Visual effects* :使用硬件或者软件layer类型和Paint,对view应用特殊的视觉处理。比如,你使用ColorMatrixColorFilter绘制一个view为黑色或者白色。
    • Compatibility* :使用软件layer类型促使view软件渲染。如果硬件加速的,有着渲染问题, 这是一个简单的方法来绕过限制的硬件渲染管道。

* View层和动画*

开启硬件加速,硬件层提供提供更快的和更平滑的动画效果。当有很多绘图操作时,动画每秒60帧不是一直能保持的。硬件层可以减轻这个,通过渲染为硬件纹理。硬件纹理可以优化View,不再需要视图不断重绘本身。当你调用invalidate()或者改变view属性时,view才会重绘。如果动画显示的不够平滑,考虑开启硬件层在你使用的View。

当view进入后台硬件层,层被混合到界面,view的属性被控制。设置这些属性很有效果,因为他们不需要view失效或者重绘。以下属性作用于混合层。
通过setter测试属性,获得最优效果:

  • alpha: 改变层透明度
  • x, y, translationX, translationY: 改变层位置
  • scaleX, scaleY: 改变层大小
  • rotation, rotationX, rotationY: 改变层的三维定位
  • pivotX, pivotY: 改变层的转换源 当view被作为ObjectAnimator启用时,这些属性被使用其他名字。如果你想使用这些属性,请调用适当的setter或者getter。比如,为了改变alpha属性,调用setAlpha()。下面的代码片段展示了最有效的方法旋转viewiew在3D的Y轴上:

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator.ofFloat(view, "rotationY", 180).start();

因为硬件层消耗媒体资源,强烈介意你只在持续动画时开启,并且在动画结束时关闭。你可以使用animation listeners完成:

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();

更多信息,请看Property Animation

* 要领和技巧*

开启硬件加速2D图像可以立即提高性能, 但你仍可以设计你的应用使用GPU性能,以下推荐:

  • 减少应用中视图的数量* 视图越多,速度越慢. 请求软件渲染通道也越慢。减少视图是优化UI的最简单的办法。
  • 避免透支* 不要在顶层绘制太多。去除那些被完全遮挡住的图层。如果你要绘制相互叠加的多个图层,考虑将他们合并为一个图层。
  • 不要在draw方法中创建render对象* 一个通常的错误是创一个Paint对象或者Path对象,在任何时候rendering方法被调用。这使得垃圾收集器运行的更频繁,忽视缓存,在硬件通道优化。
  • 不要太频繁的改变图形* 图形实例化时,由texture masks被渲染。任何时候你改变路径, 硬件通道创建一个新的mask,这是非常耗资源的。
  • 不要太频繁的改变位图* 任何时候你改变一个位图的内容,它作为GPU纹理重新被上传在下一次绘制时。
  • 使用透明度要小心* 当你通过setAlpha()来改变透明度时,AlphaAnimation,或者ObjectAnimator,在off-screen buffer被渲染,它两倍于使用fill-rate。当应用alpha在非常大的界面上时,考虑设置视图属性LAYER_TYPE_HARDWARE.
  • 转自:http://wiki.eoe.cn/page/Hardware_Acceleration.html
分享到:
评论

相关推荐

    基于YOLOv5工地上安全帽佩戴的检测源码+训练好模型+数据集+详细训练教程.zip

    V5.0版本实现工地上安全帽佩戴的检测,因此本项目的主要实现背景是在Jetson Nano上部署好安全帽佩戴检测的代码,当然,在Windows/Linux上同样可以实现,并且本项目包含TensorRT加速使其能够在边缘硬件平台上能够更快...

    软件绿化教程(EXE格式)

    偏分好几段,一次无法粘贴完,也许你说你有序列号输入工具,可以一键输入,但是第一,不见得人人都 有这个工具,第二,你是不是还需要去启动那个工具呢?费事吧?我的经验是,用注册表工具监测,然后 注册成功后...

    瑞友天翼使用说明书

    天翼V4.0在天翼V3.x系列产品集群基础上,增加了基于IP动态漂移技术的负载均衡和故障转移能力,可以更好的支持大规模并发访问。 天翼V4.0提供了系统资源共享优化技术(共享程序代码段资源,双缓存I/O信息),可以成倍...

    硬盘缓存增强软件 PrimoCache Desktop Edition 3.0.2 中文多语免费版.zip

    该算法结合了常用的LFU和LRU算法,并具有自适应调整性,可提供更好的命中率,并无需用户进行参数设置。 PrimoCache支持多种缓存策略以及灵活的缓存设置。您可轻松为您的物理硬盘创建缓存,提高硬盘的读写性能。由于...

    DGSetup_3040E2_20190628.exe

    在以后的版本中此功能将会得到扩充,您可以查看更多的硬件信息,对您的硬件了如指掌。 驱动精灵更新日志: 驱动精灵 V9.2更新内容: 全球97%的超高硬件驱动支持率 多重算法保证驱动精确匹配 双重下载引擎,全网CDN...

    BlackBerry开发平台配置及入门介绍(傻瓜教程)

    的设备为组织提供了更大的灵活性、使他们能够选择最适合他们的需要的硬件。  *国际无线服务-BlackBerry可以用于覆盖50多个国家的100多个网络、提供众多无线网络技术及运营商可供选择。BlackBerryEnterpriseSolution...

    Moco-Minitaur-LTS-:本项目是国内唯一对标GhostRobotics Minitaur机器人的开源项目,力图为大家提供一个能实现真正力控的可靠、低成本、开放平台!!!

    Moco-Minitaur LTS 高性能 开源 力控 四足机器人 平台 本项目为开源桌面级8自由度四足机器人的相关资料,知乎...____如果您觉得该项目对您有帮助,也为了更好的项目推进和软硬件更新,如果愿意请通过微信捐赠该项目!

    Pixelmator_3.9.8_MAS__TNT__xclient.info.dmg.zip

    Mac OS X 专有的图像处理软件。Pixelmator 界面清爽,布局灵活,熟悉 Photoshop 的人可迅速上手。...对于Pixelmator的未来,Dailide认为团队的目标只有一个,开发最好的软件,创造更好的用户体验。

    Mirillis Action v4.24.2一款国外超棒的高清视频录像工具.rar

    屏幕录像机和任何纯色背景,什么是更便宜的解决方案,并给出相同,如果不是更好的结果。 3.录制网络摄像头或USB / HDMI捕获设备 选择设备录制模式以从游戏控制台,其他PC,电视广播,网络摄像头或便携式摄像机捕获...

    firesim:模拟游戏

    FireSim:易于使用、可扩展、FPGA 加速、周期精确的硬件仿真内容使用 FireSim 要开始使用 FireSim,请参阅 FireSim 文档站点上的教程: ://docs.fires.im/。 另一个很好的概述(视频格式)是我们在的 Chisel 社区...

    aws-fpga-app-notes:F1 EC2实例的应用说明

    本应用笔记的目的是在实现使用PCIM AXI端口在卡和主机存储器之间传输数据的自定义逻辑(CL)时为F1开发人员提供更多信息。 给出了一个小型设备驱动程序,该驱动程序说明了控制连接到PCIM端口的硬件模块的基本要求。 ...

    vtk-js:Web可视化工具包

    VTK包括许多高级算法(例如,表面重建,隐式建模,抽取)和渲染技术(例如,硬件加速的体积渲染,LOD控制)。 JavaScript实现仍然是实际C ++库的子集,但将努力将本地VTK代码轻松移植或编译到WebAssembly中,以更好...

    新版Android开发教程.rar

    ----------------------------...• 优化的图形库 包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 (硬件加速可选) • SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和...

    海蜘蛛软路由宽带叠加双倍网速

    宽带生活 - 因你更精彩 - Www.ChinAdsl.Net r( I; R$ f9 V6 r" U( D 有一条电话线.一个猫,一张网卡.2个电信pppoe拨号账号.分别为2m和4m.而我的端口速率下行为5954kbps,大致接近6m.在这种情况下使用才有意义.3G...

    STM32CubeMX用户手册中文版UM1718-翻译版.rar

    告诉你他们不能使用了。还有些变黄了,说明他们可以选择性使用,真是太方便了,省去了查资料慢慢找io的痛苦。比如我们还要给它个外部时钟。我们勾选时钟即可,响应的时钟脚就会分配出来。 如果要将某个脚设置成...

    localcesium:尝试

    它使用WebGL进行硬件加速的图形,并跨平台,跨浏览器进行调整,以实现动态数据可视化。 开始使用 请参阅教程。 有问题吗? 在上询问他们。 有兴趣贡献吗? 参见。 使命 我们的任务是创建领先的基于Web的地球仪和...

    java源码嵌套for循环-AnyaBasic:AnyaBASIC是一种用Java编写的可移植的解释型编程语言。它的语法类似于BASIC,但加

    循环的java源码压缩安雅基础 [A]绝对 [N] 不 [Y] 我们的 [A] 平均 BASIC “可以的小玩具语言。...然而,虽然这开始是一个“笑话”,但...全硬件加速 安装: 将存档解压缩到您选择的任何目录。 C:/Programming/ 推荐用于 Co

    Mac OS X Snow Leopard 10A432雪豹 BT种子

    PC安装Mac OS X Snow ...允许利用显卡的3D硬体加速功能来更快速地合成影像。 3.本文是自己实践安装教程,参考了http://bbs.pcbeta.com/thread-592288-1-1.html 这篇文章,更多问题可参考之,比如五国,死机等等 。

Global site tag (gtag.js) - Google Analytics