HardwareAcceleration硬件加速

上传人:枫** 文档编号:473027355 上传时间:2023-02-01 格式:DOC 页数:6 大小:107KB
返回 下载 相关 举报
HardwareAcceleration硬件加速_第1页
第1页 / 共6页
HardwareAcceleration硬件加速_第2页
第2页 / 共6页
HardwareAcceleration硬件加速_第3页
第3页 / 共6页
HardwareAcceleration硬件加速_第4页
第4页 / 共6页
HardwareAcceleration硬件加速_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《HardwareAcceleration硬件加速》由会员分享,可在线阅读,更多相关《HardwareAcceleration硬件加速(6页珍藏版)》请在金锄头文库上搜索。

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

2、启或者关闭硬件加速在以下几个层面: Application Activity Window View如果你的应用执行自定义绘制,开启硬件加速,测试应用在实际的硬件设备上去查找问题。控制硬件加速你可以在以下层面控制硬件加速 Application Activity Window ViewApplication 层在你的Android manifest文件里,添加以下属性到标签里,针对整个应用开启硬件加速:Activity 层如果整个应用开启硬件加速表现的不稳定,你也可以针对单个Activity进行控制。在Activity层开启或者关闭硬件加速,你可以使用android:hardwareAccel

3、erated属性在标签内。下面是单个Activity中关闭硬件加速的例子: Window 层如果你需要更细致的控制,可以在获得的Window里开启硬件加速: getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 注: 在window层不能取消硬件加速。View 层通过下面代码,你可以在运行时关闭硬件加速: myView.setLayerType(View.LAYER_TYPE_SOFTWA

4、RE, null); 注:你不能在view层开启硬件加速。 View面板有其他方法关闭硬件加速。更多详细内容请看View面板。判断View是否已经硬件加速有时候,知道一个应用当前是否硬件加速是非常有用的,尤其像自定义View。这非常有用,当你的应用做大量的自定义绘制并且不是所有操作都支持新的渲染管道。有两个方法查看应用是否硬件加速: View.isHardwareAccelerated()如果View附属于硬件加速的窗体,将会返回true。 Canvas.isHardwareAccelerated()如果Canvas已硬件加速,将会返回true。如果你一定要在绘制代码中进行这个查看,请尽可能用

5、Canvas.isHardwareAccelerated()代替View.isHardwareAccelerated()。当一个View附属于硬件加速窗体,它仍可以通过非硬件加速的Canvas来绘制。这种情况,在实例化时,绘制一个View到bitmap中,为了缓存目的。Android绘画模型当开启硬件加速,新的绘画模型利用显示列表在界面上渲染你的应用。 为了完全理解显示列表和对你的应用有怎样的影响,知道Android不通过硬件加速怎么样绘制View也很重要。下面的篇章阐述基于软件和基于硬件的绘画模型。基于软件的绘画模型在软件绘画模型中,View通过以下两个步骤被绘制: 使层次失效 绘制层次每当

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

7、date()没有被调用。此时,你依赖于另外一个view使之失效来达到合适的反应。这个反应会在任何时候改变在你修改你的应用时。因此,你需要一直调用invalidate()在你的自定义view上,无论你修改数据或者影响你view绘画代码的声明。注: Android view当它的属性改变时,自动调用invalidate(),比如背景颜色或者文本框内容。基于硬件的绘画模型Android仍使用invalidate()和draw()来响应界面更新和视图渲染,不同的是控制当前绘制。Android系统将他们记录在显示列表来代替马上执行绘画命令,它包含view层绘画代码的输出。另外一个优化是Android系统

8、只需对记录和更新显示列表,通过调用invalidate()将view标记为。 还没失效的View通过重新运行之前的记录显示列表被重绘。这个新绘画模型包括三个阶段: 1、层失效 2、记录更新显示列表 3、绘画显示列表用此模式,你不能依赖与脏区域交叉的view来执行它的draw()。为了确保Android系统记录一个View的显示列表,你必须调用invalidate()。 忘记这么做会导致视图看起来一样,甚至在改变它后。一旦发生,这个BUG很容易被发现。使用显示列表也利于动画增强,因为设置特殊的属性,像透明度和旋转, 不需要使目标视图失效(它自动完成)。这个优化也适用于显示列表的视图 (你应用的任

9、一视图都硬件加速) 比如,假设有个LinearLayout在Button上有个ListView。LinearLayout的显示列表看上去这样:DrawDisplayList(ListView)DrawDisplayList(Button)假设你现在要改变ListView的不透明,在调用setAlpha(0.5f)后,显示列表变成:SaveLayerAlpha(0.5)DrawDisplayList(ListView)RestoreDrawDisplayList(Button)ListView的设置代码没有被执行。系统只更新显示列表中更简单的LinearLayout。在未开启硬件加速的应用中,列

10、表的绘制代码在其父亲中还会被执行一次。不支持的绘画操作当启动硬件加速, 2D渲染通道支持一般使用的画布绘画操作和一些较少使用的操作。所有的绘画操作被用于渲染程序,默认为widget和layout,还有些高级应用比如反光和纹理平铺也是被支持的。下面是不被硬件加速的操作清单: Canvaso clipPath()o clipRegion()o drawPicture()o , int, int, android.graphics.Path, float, float, android.graphics.Paint) drawTextOnPath()o int, float, int, float,

11、 int, int, int, short, int, int, android.graphics.Paint) drawVertices() Painto setLinearText()o setMaskFilter()o setRasterizer() Xfermodeso AvoidXfermodeo PixelXorXfermode另外, 有些操作在硬件加速开启后会发生变化: Canvaso clipRect(): XOR, Difference and ReverseDifference clip modes are ignored. 3D transforms do not app

12、ly to the clip rectangleint, int, float, int, int, int, android.graphics.Paint) drawBitmapMesh() : colors array is ignored Painto setDither(): ignoredo setFilterBitmap(): filtering is always ono float, float, int) setShadowLayer(): works with text only PorterDuffXfermodeo PorterDuff.Mode.DARKENwill

13、be equivalent toSRC_OVERwhen blending against the framebuffer.o PorterDuff.Mode.LIGHTENwill be equivalent toSRC_OVERwhen blending against the framebuffer.o PorterDuff.Mode.OVERLAYwill be equivalent toSRC_OVERwhen blending against the framebuffer. ComposeShader(郑州北大青鸟http:/ ComposeShadercan only cont

14、ain shaders of different types (aBitmapShaderand aLinearGradientfor instance, but not two instances ofBitmapShader)o ComposeShadercannot contain aComposeShader如果你的应用受缺失属性和限制的影响,你可以关闭硬件加速,在你受影响的部分调用android.graphics.Paint) setLayerType(View.LAYER_TYPE_SOFTWARE, null)。这个方法, 你仍可以利用硬件加速其他任一地方。查看Controlling Hardware Acceleration得到关于硬件加速的更多信息。View 层在Android的不同版本, view已经有能力渲染进入屏幕缓存区内,无论是view的绘制缓存,还是使用android.graphics.Paint, int) Canvas.saveLayer()。屏幕缓存,或层,有多种用途。你可以使用他们获得更好的性能,当动画组合视图或者需要应用复合效应。比如,你可以使用Canvas.saveLayer()来实现消退效果来临时渲染一个view进入层,然后使用opacity factor合成到界面。Android 3.0 (AP

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号