Android硬件加速
原文地址: http://developer.android.com/guide/topics/graphics/hardware-accel.html
硬件加速
Android 3.0 (API level 11), 开始支持
所有的View 的canvas都会使用GPU,但是硬件的加速会占有一定的RAM。
在API >= 14上,默认是开启的,如果你的应用只是标准的View和Drawable,全局都打开硬件加速,是不会有任何问题的。
然而,硬件加速并不支持所有的2D画图的操作,这时开着它,可能会影响到你的自定义控件或者绘画,出现异常等行为,
所以android对于硬件加速提供了可选性
如果你的应用执行了自定义的绘画,可以通过在真机上测试开启硬件加速查找问题
硬件加速的级别
Application <application android:hardwareAccelerated="true" ...>
Activity
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
Window
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
View
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Note: 你可以关闭View级别的硬件加速,但是你不能在View级别开启硬件加速,因为它还依赖其他的设置
两种获取是否支持硬件加速的方式
View.isHardwareAccelerated() returns true if the View is attached to a hardware accelerated window.
Canvas.isHardwareAccelerated() returns true if the Canvas is hardware accelerated
如果必须进行这样的验证,建议你在draw的代码块中使用:Canvas.isHardwareAccelerated(),因为如果一个View被attach到一个硬件加速的Window上,
即使没有硬件加速的Canvas,它也是可以被绘制的。比如:将一个View以bitmap的形式进行缓存
Android的绘制模型
开启硬件加速后,Android框架将采用新的绘制模型。
基于软件的绘制模型和基于硬件的绘制模型的区别:
应用程序调用invalidate()更新UI的某一部分,失效(invalidation)消息将会在整个视图层中传递,计算每个需要重绘的区域(即脏区域)。
然后Android系统将会重绘所有和脏区域有交集的view。很明显,这种绘图模式存在缺点:
1. 每个绘制操作中会执行不必要的代码。比如如果应用程序调用invalidate()重绘button,而button又位于另一个view之上,
即使该view没有变化,也会进行重绘。
2. 可能会掩盖一些应用程序的bug。因为android系统会重绘与脏区域有交集的view,所以view的内容可能会在没有调用invalidate()的情况
下重绘。这可能会导致一个view只有在其它view时失效才得到正确的行为。这种行为可能在每次修改应用的时候都会发生改变。
因此,你需要一直调用invalidate在你的自定义控件上,不管那些涉及到重绘的代码是否修改了数据或状态。
Note:android view 在属性值变化的时候会自动调用invalidate,比如一个TextView的颜色或者背景的变化。
Android系统仍然使用invalidate()和draw()来绘制view,但在处理绘制上有所不同。
Android系统记录绘制命令到显示列表,包含的视图层次的绘图输出,而不是立即执行绘制命令。
另一个优化就是Android系统只需记录和更新标记为脏(通过invalidate())的view。新的绘制模型包含三个步骤:
1. Invalidate the hierarchy
2. 记录和更新显示列表
3. 绘制显示列表
在这种模式下,你不能指望一个视图相交的肮脏的地区会执行其draw()方法。为了确保Android系统记录视图的显示列表,你必须调用
invalidate()。否则会导致View不会刷新。
使用显示列表对动画的性能也会有好处,因为某些明确的属性,例如 alpha或者旋转,不要求invalidate目标View,(会自发的执行)。
这种优化也可以应用于所有显示列表的视图(当application硬件加速的时候)。
假设有一个LinearLayout,包含上述按钮列表。对于LinearLayout显示列表看起来像这样:
DrawDisplayList(ListView)
DrawDisplayList(Button)
假设你想改变ListView的透明度,在listview上调用了setAlpha之后,这个显示列表包括:
SaveLayerAlpha(0.5)
DrawDisplayList(ListView)
Restore
DrawDisplayList(Button)
ListView的复杂的draw代码块没有执行,相反,系统只会更新这个更简化的显示列表,如果应用中没有开启硬件加速,list和其父类的draw代码块
会再次执行。
硬件加速的2D渲染管道的建立是第一个支持不成比例的绘画,但是过高的值会影响到绘图操作的质量。
这些绘制的操作是按照1.0的规模纹理实现的,由GPU转化。在API级别<17,伴随着规模的增长会导致
如果你的应用程序是由任何这些特征缺失或限制的影响,你可以通过setLayerType(View.LAYER_TYPE_SOFTWARE, null).关闭它,不会影响到你再
别的地方使用硬件加速。
在所有版本的Android,所有的View具有渲染到锁屏缓冲区的能力,或通过View的绘制缓存,或者调用 Canvas.saveLayer().
锁屏缓冲区或者layers拥有几种用途。在实现复杂的动画或者应用于组件效果器的时候。比如, 实现退色效果:通过Canvas.saveLayer 临时的分发一个view到layer,
然后以一个不透明的参数返回.
在Android 3(API级别11开始),你有更多的控制如何以及何时使用层与视图setlayertype()方法。
这个API有两个参数:Layer的类型和一个可选的Paint,你可以使用Paint参数应用到颜色过滤器,特殊的混合模式,或者对于一个图层的不透明度。
视图可以使用三个layer类型:
LAYER_TYPE_NONE:
正常的使用,不会通过锁屏的缓冲区返回。
LAYER_TYPE_HARDWARE:
视图是由硬件实现为硬件机构如果应用硬件加速。如果应用程序没有硬件加速,这层型表现相同layer_type_software。
LAYER_TYPE_SOFTWARE:
layer的类型依赖于你的需求;
性能:
使用硬件层类型来渲染一个视图到纹理层,一旦视图被渲染成一层,其绘图代码不必执行,直到视图调用invalidate()执行。
一些动画,如α-动画,然后可以被直接应用到层,使用GPU来做是非常高效的。
视觉效应:
使用硬件或软件层型和涂料适用于特殊的视觉处理的观点。例如,你可以通过colormatrixcolorfilter画一个黑白相间的视图。
兼容性:
使用一个软件层类型去强制渲染一个视图。如果一个被硬件加速的视图(例如,如果你的整个应用程序的硬件加速),就会出现
渲染的问题,这是一个解决硬件渲染管线限制的简单的方法。
当你的应用程序的硬件加速,硬件层可以提供更快和更平滑的动画。
在每秒60帧运行一个处理大量绘图操作的复杂动画有时候是不可能的。
这可以通过使用硬件层渲染为硬件纹理缓解。然后硬件纹理可以用来制作视图的动画,不需要视图在动画的时候不断重绘自己。视图不被重绘,
除非你改变视图的属性,调用了invalidate(),或者你手动的调用invalidate,你将不会得到一个平滑的动画。这时你需要考虑开启硬件层应用
到你的动画。
当一个视图是由硬件层的支持,它的一些属性通过layer被合成到屏幕的方式处理。
设置这些属性将是有效的因为他们不需要视图invalidate和重绘。下面列出的属性影响layer合成的方式
alpha:
Changes the layer's opacity
x, y, translationX, translationY:
Changes the layer's position
scaleX, scaleY:
Changes the layer's size
rotation, rotationX, rotationY:
Changes the layer's orientation in 3D space
pivotX, pivotY:
Changes the layer's transformations origin
因为硬件层使用视频内存,它是高度推荐你在启动动画的时候开启它们,在动画完成的时候关闭它们。
Tip & Tricks
切换硬件加速的2D图形可以立即提高性能,但你仍应该遵循以下建议以便有效地利用GPU应用程序
减少应用程序中的View的数量
需要绘制的视图越多,它的速度就越慢。这同样适用于软件渲染。减少视图是一个简单的方法来优化您的UI。
避免透支
不在彼此的顶部画太多的层次。移除任何被它上面不透明的视图完全遮盖的视图。如果你需要绘制几层的混合在一起,把它们合并为一个单一的层。
对于当前的硬件,一个好的经验法则是不在屏幕上画出每帧的像素数超过2.5次(在一个位图透明像素计数!)。
不要创建渲染对象的绘制方法
一个常见的错误是,每一次渲染方法被调用的时候都创建一个新的Paint或一个新的Path。这迫使垃圾收集器运行更加频繁,也绕过缓存优化的硬件管道。
不要太频繁的修改形状
复杂的形状,Path,Circle,每次都是通过texture masks来渲染的,每次创建或者修改Path,这个硬件管道会创建一个新的mask,而这时十分昂贵的。
不要太频繁的修改Bitmap
每次改变Bitmap的内容,都会作为一个GPU texture再次上传,然后下次重新绘制。
谨慎使用alpha
当你使用setAlpha,AlphaAnimation或者ObjectAnimator实现一个透明的View时,它会在一个双倍的填充率的离屏的缓冲区渲染。
Android硬件加速相关推荐
- Android 系统(175)---Android硬件加速原理与实现简介
Android硬件加速原理与实现简介 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到"硬件加速"这个词.由于操作系统对底层软硬件封装非常完善,上层软件开发者往往 ...
- Android 系统(66)---Android硬件加速相关问题总结
Android硬件加速相关问题总结 从Android 3.0开始就支持硬件加速,充分利用GPU的特性,使得绘制View的时候更加平滑.例如在ListView(GridView)或者WebView中使用 ...
- [学习记录]浅谈Android硬件加速
最近看了一些Android硬件加速的文章,因此做个记录与总结 众所周知 ,如果使用GPU进行图形绘制,就认为是硬件减速绘制:反之,则是软件绘制. 以平时开发举例,实现一个圆角矩形按钮通常有两种方案:使 ...
- Android 硬件加速使用总结
从Android3.0(API Level 11)开始,支持硬件加速,可充分利用GPU的特性,使得界面渲染更加平滑,但是会消耗更多内存RAM.硬件加速自身并非完美,在某些Android5的rom上,由 ...
- Android硬件加速(二)-RenderThread与OpenGL GPU渲染
Android4.0之后,系统默认开启硬件加速来渲染视图,之前,理解Android硬件加速的小白文简单的讲述了硬件加速的简单模型,不过主要针对前半阶段,并没怎么说是如何使用OpenGL.GPU处理数据 ...
- “Android 硬件加速与 View Layer ”知识点笔记
阅读文章:HenCoder Android 自定义 View 1-8 硬件加速 辅助参考文章: 1.Display List构建过程分析 2.Android硬件加速原理与实现简介 3.关于硬件加速的那 ...
- Android硬件加速原理与实现
一 概述 在手机客户端尤其是 Android 应用开发过程中,我们经常会接触到"硬件加速"这个概念.由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解 ...
- android硬件加速 setLayerType
从Android 3.0开始,Android的2D渲染管线可以更好的支持硬件加速.硬件加速使用GPU进行View上的绘制操作. 硬件加速可以在一下四个级别开启或关闭: Application Acti ...
- android硬件加速默认,android 硬件加速
这两天发现,小米1+上,图文详情老是闪退,好吧,商品详情问题还是挺多的 报错信息是: 07-24 09:59:08.601: W/crash_handler(6887): Caught a crash ...
- android开启加速功能,Android硬件加速开发简介
从 Android 3.0(API Level 11)开始,Android 2D 渲染管线被设计为能更好地支持硬件加速功能. 硬件加速功能将所有在 View 组件的 Canvas 上执行的绘制操作都交 ...
最新文章
- 利用BP神经网络教计算机进行非线函数拟合(代码部分单层)
- Spring IOC 容器源码分析 - 循环依赖的解决办法
- Codeforces 1246D/1225F Tree Factory (构造)
- iptables基础篇
- 分析:合格的UTM设备评判与选择
- 南怀瑾先生说中风急救关键(非常推荐!!)
- springboot----热部署
- hive取mysql数据oracle数据,Hive安装过程(mysql/oracle存储元数据)详解
- android手机分区调整大小写,如何使用PQMagic调整磁盘分区容量大小
- 计算机术语bisoin,[焦仔推荐]菜鸟起飞!让你清楚认识电脑BIOS(经典知识性文章)...
- 领导提拔你的原因,只有这点最真实,其他都是瞎扯!
- 如何在 SAP 轻松访问屏幕上以不同的布局创建不同的启动板
- UnityShader学习笔记:Caustic水纹焦散与鱼群制作水族馆
- Docker常用容器命令
- Example 3, 4 of variadic templates
- 什么是FD.IO/VPP?
- CAShapeLayer和UIBezierPath
- 车联网各领域头部企业排行榜!
- Windows 程序设计 相关的经典好书(备忘)
- ThinkPHP5.0+Queue消息队列
热门文章
- winform日历控件
- 三级行政区划 mysql_全国三级行政区划数据 常用查询语句
- DPDK Release 21.05
- 管理员登录页面html代码,Admin管理员登录界面
- JDK各个版本的特性分析|JDK7|JDK8|JDK9|JDK10|JDK11|JDK12|JDK13特性分析
- “数据折叠:那些AI背后“标数据的人”正在回家
- 安徽省地理信息系统应用成果
- android控制wifi,基于 Android 手机操作和控制的 Wifi 小车程序设计
- 怎么用计算机计算t分布的概率,MATLAB如何使用tpdf函数计算T分布的概率密度
- PostgresSQL弱密码导致命令执行