版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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文件里,添加以下属性到<application>标签里,针对整个应用开启硬件加速:<application android:hardwa
3、reaccelerated="true" .>activity 层如果整个应用开启硬件加速表现的不稳定,你也可以针对单个activity进行控制。在activity层开启或者关闭硬件加速,你可以使用android:hardwareaccelerated属性在<activity>标签内。下面是单个activity中关闭硬件加速的例子: <application android:hardwareaccelerated="true"> <activity . /> <activity android:hardwa
4、reaccelerated="false" /></application> window 层如果你需要更细致的控制,可以在获得的window里开启硬件加速: getwindow().setflags( windowmanager.layoutparams.flag_hardware_accelerated, windowmanager.layoutparams.flag_hardware_accelerated); · 注: 在window层不能取消硬件加速。view 层通过下面代码,你可以在运行时关闭硬件加速: myview.setlayer
5、type(view.layer_type_software, null); 注:你不能在view层开启硬件加速。 view面板有其他方法关闭硬件加速。更多详细内容请看view面板。判断view是否已经硬件加速有时候,知道一个应用当前是否硬件加速是非常有用的,尤其像自定义view。这非常有用,当你的应用做大量的自定义绘制并且不是所有操作都支持新的渲染管道。有两个方法查看应用是否硬件加速:· view.ishardwareaccelerated() 如果view附属于硬件加速的窗体,将会返回true。· canvas.ishardwareaccelerated()
6、160;如果canvas已硬件加速,将会返回true。如果你一定要在绘制代码中进行这个查看,请尽可能用canvas.ishardwareaccelerated()代替view.ishardwareaccelerated()。当一个view附属于硬件加速窗体,它仍可以通过非硬件加速的canvas来绘制。这种情况,在实例化时,绘制一个view到bitmap中,为了缓存目的。android绘画模型当开启硬件加速,新的绘画模型利用显示列表在界面上渲染你的应用。 为了完全理解显示列表和对你的应用有怎样的影响,知道android不通过硬件加速怎么样绘制view也很重要。下面的篇章阐述基于软件和基于硬件的绘
7、画模型。基于软件的绘画模型在软件绘画模型中,view通过以下两个步骤被绘制:· 使层次失效· 绘制层次每当应用需要更新部分ui时,调用invalidate()(或者它的变形)在任意需要改变内容的view里。这些失效信息被传播始终在view层,计算需要重绘的界面区域。然后,android系统绘制任意view在这些区域。不幸的是,这种模型有两个缺点:· 第一,这种模型需要执行的大量的代码在每一次绘画。比如,如果你的应用在按钮里调用了invalidate() ,而且这个按钮在另外一个view之上,此时android系统会重绘这个view,即时它没有发生改变。&
8、#183; 第二个问题是绘画模型会隐藏你应用的错误。从android系统开始重绘view,当他们与脏区域融合时,你改变的view的内容可能会被重绘即时invalidate()没有被调用。此时,你依赖于另外一个view使之失效来达到合适的反应。这个反应会在任何时候改变在你修改你的应用时。因此,你需要一直调用invalidate()在你的自定义view上,无论你修改数据或者影响你view绘画代码的声明。注: android view当它的属性改变时,自动调用invalidate() ,比如背景颜色或者文本框内容。基于硬件的绘画模型android仍使用invalidate()和draw()
9、来响应界面更新和视图渲染,不同的是控制当前绘制。android系统将他们记录在显示列表来代替马上执行绘画命令,它包含view层绘画代码的输出。另外一个优化是android系统只需对记录和更新显示列表,通过调用invalidate()将view标记为。 还没失效的view通过重新运行之前的记录显示列表被重绘。这个新绘画模型包括三个阶段:· 1、层失效· 2、记录更新显示列表· 3、绘画显示列表用此模式,你不能依赖与脏区域交叉的view来执行它的draw() 。为了确保android系统记录一个view的显示列表,你必须调用invalidate()
10、;。 忘记这么做会导致视图看起来一样,甚至在改变它后。一旦发生,这个bug很容易被发现。使用显示列表也利于动画增强,因为设置特殊的属性,像透明度和旋转, 不需要使目标视图失效(它自动完成)。这个优化也适用于显示列表的视图 (你应用的任一视图都硬件加速) 比如,假设有个linearlayout在button上有个listview。linearlayout的显示列表看上去这样:drawdisplaylist(listview)drawdisplaylist(button)假设你现在要改变listview的不透明,在调用setalpha(0.5f)后,显示列表变成:savelayeralpha(0.
11、5)drawdisplaylist(listview)restoredrawdisplaylist(button)listview的设置代码没有被执行。系统只更新显示列表中更简单的linearlayout。在未开启硬件加速的应用中,列表的绘制代码在其父亲中还会被执行一次。不支持的绘画操作当启动硬件加速, 2d渲染通道支持一般使用的画布绘画操作和一些较少使用的操作。所有的绘画操作被用于渲染程序,默认为widget和layout,还有些高级应用比如反光和纹理平铺也是被支持的。下面是不被硬件加速的操作清单:· canvaso clippath()o clipregion()o drawpi
12、cture()o , int, int, android.graphics.path, float, float, android.graphics.paint) drawtextonpath()o int, float, int, float, int, int, int, short, int, int, android.graphics.paint) drawvertices()· painto setlineartext()o setmaskfilter()o setrasterizer()· xfermodeso avoidxfermodeo pixelxorxf
13、ermode另外, 有些操作在硬件加速开启后会发生变化:· canvaso cliprect() : xor, difference and reversedifference clip modes are ignored. 3d transforms do not apply to the clip rectangleint, int, float, int, int, int, android.graphics.paint) drawbitmapmesh() : colors array is ignored· painto setdither()
14、: ignoredo setfilterbitmap() : filtering is always ono float, float, int) setshadowlayer() : works with text only· porterduffxfermodeo porterduff.mode.darken will be equivalent to src_over when blending against the framebuffer.o porterduff.mode.lighten will be equi
15、valent to src_over when blending against the framebuffer.o porterduff.mode.overlay will be equivalent to src_over when blending against the framebuffer.· composeshader(郑州北大青鸟o composeshader can only contain shaders of different types (a bitmapshader and a
16、 lineargradient for instance, but not two instances of bitmapshader )o composeshader cannot contain a composeshader如果你的应用受缺失属性和限制的影响,你可以关闭硬件加速,在你受影响的部分调用android.graphics.paint) setlayertype(view.layer_type_software, null) 。这个方法, 你仍可以利用硬件加速其他任一地方。查看controlling hardw
17、are acceleration得到关于硬件加速的更多信息。view 层在android的不同版本, view已经有能力渲染进入屏幕缓存区内,无论是view的绘制缓存,还是使用android.graphics.paint, int) canvas.savelayer()。屏幕缓存,或层,有多种用途。你可以使用他们获得更好的性能,当动画组合视图或者需要应用复合效应。比如,你可以使用canvas.savelayer()来实现消退效果来临时渲染一个view进入层,然后使用opacity factor合成到界面。android 3.0 (api level 11)开始,你有更多的控制通过android
18、.graphics.paint) view.setlayertype()方法,怎样或者什么时候使用layers。这个api有2个参数:layer的类型和可选的paint对象,它阐明layer怎么样合成。 你可以使用paint参数使用滤色镜,特殊的混合模式,或者设置为不透明。view可以使用三种layer类型的其中一种:· layer_type_none:被一般渲染并且不会被进入屏幕缓存。这是默认行为。· layer_type_hardware:由硬件渲染到硬件纹理,如果应用开启硬件加速。如果未开启, 就同layer_type_software。· layer_ty
19、pe_software:由软件渲染到位图。the type of layer you use depends on your goal:· performance: 由硬件渲染到硬件纹理,一旦view被渲染到layer,它的绘图代码不会被执行直到调用invalidate()。有些动画,像透明度动画,直接放入layer,由gpu完成非常有效率。· visual effects:使用硬件或者软件layer类型和paint,对view应用特殊的视觉处理。比如,你使用colormatrixcolorfilter绘制一个view为黑色或者白色。· compatibility
20、:使用软件layer类型促使view软件渲染。如果硬件加速的,有着渲染问题, 这是一个简单的方法来绕过限制的硬件渲染管道。(计算机学校view层和动画开启硬件加速,硬件层提供提供更快的和更平滑的动画效果。当有很多绘图操作时,动画每秒60帧不是一直能保持的。硬件层可以减轻这个,通过渲染为硬件纹理。硬件纹理可以优化view,不再需要视图不断重绘本身。当你调用invalidate()或者改变view属性时,view才会重绘。如果动画显示的不够平滑,考虑开启硬件层在你使用的view。当view进入后台硬件层,层被混合到界面,view的属性被控制。设置这些属性很有效果,因为他们不需要view失效或者重绘
21、。以下属性作用于混合层。 通过setter测试属性,获得最优效果:· alpha: 改变层透明度· x, y, translationx, translationy: 改变层位置· scalex, scaley: 改变层大小· rotation, rotationx, rotationy: 改变层的三维定位· pivotx, pivoty: 改变层的转换源当view被作为objectanimator启用时,这些属性被使用其他名字。如果你想使用这些属性,请调用适当的setter或者getter。比如,为了改变alpha属性,调用setalpha(
22、) 。下面的代码片段展示了最有效的方法旋转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, "rot
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度床垫行业展会参展商采购合同3篇
- 2024版航天器发射与数据服务合同
- 2024版临时工合同协议书范文
- 2024年软件开发购销合同
- 个人借款协议模板2024专业版版B版
- 二零二五版二手房买卖合同公证服务合同规范与执行2篇
- 2024版股权激励合同2篇
- 二零二五版房屋买卖更名与配套设施移交协议3篇
- 二零二五年度环保项目垫资合同范本2篇
- 2024幼儿园幼儿教师聘任与劳动合同书3篇
- 2024-2025学年成都高新区七上数学期末考试试卷【含答案】
- 定额〔2025〕1号文-关于发布2018版电力建设工程概预算定额2024年度价格水平调整的通知
- 2025年浙江杭州市西湖区专职社区招聘85人历年高频重点提升(共500题)附带答案详解
- 《数学广角-优化》说课稿-2024-2025学年四年级上册数学人教版
- “懂你”(原题+解题+范文+话题+技巧+阅读类素材)-2025年中考语文一轮复习之写作
- 2025年景观照明项目可行性分析报告
- 2025年江苏南京地铁集团招聘笔试参考题库含答案解析
- 2025年度爱读书学长参与的读书项目投资合同
- 电力系统分析答案(吴俊勇)(已修订)
- 化学-河北省金太阳质检联盟2024-2025学年高三上学期12月第三次联考试题和答案
- 期末复习试题(试题)-2024-2025学年四年级上册数学 北师大版
评论
0/150
提交评论