Android应用开发:图形绘制之硬件加速
来源:互联网 发布:淘宝凯洛伦面具 编辑:程序博客网 时间:2024/06/01 08:05
转自:http://blog.csdn.net/airk000/article/details/38925059
引言
在Android3.0后,Android的2D渲染通道开始支持硬件加速,也就是说所有View的Canvas绘画动作都会使用GPU,同时也代表着应用程序会损耗更多的内存。而在Android4.0(API14)之后硬件加速功能就被默认开启了。如果你的应用程序是由各种标准View和Drawable组成的,那么硬件加速并不会引起任何不适。众所周知,使用硬件加速会调用到OpenGL,但是OpenGL不同版本会存在不支持一些操作的情况,也就是说,硬件加速可能会影响一些自定义View及绘制过程。因此,Android系统提供了关闭硬件加速的方法,好的消息是,可以在不同层级上对硬件加速功能进行控制,而不至于整个应用程序因为某一个绘制动作的障碍而整体都不能使用硬件加速,毕竟硬件加速能够带来更加流畅、更加绚丽的界面效果。
不支持的列表
PS:列表有错位,标题向后移动一个
API level< 16161718CanvasdrawBitmapMesh() (colors array)✗✗✗✓drawPicture()✗✗✗✗drawPosText()✗✓✓✓drawTextOnPath()✗✓✓✓drawVertices()✗✗✗✗setDrawFilter()✗✓✓✓clipPath()✗✗✗✓clipRegion()✗✗✗✓clipRect(Region.Op.XOR)✗✗✗✓clipRect(Region.Op.Difference)✗✗✗✓clipRect(Region.Op.ReverseDifference)✗✗✗✓clipRect() with rotation/perspective✗✗✗✓PaintsetAntiAlias() (for text)✗✗✗✓setAntiAlias() (for lines)✗✓✓✓setFilterBitmap()✗✗✓✓setLinearText()✗✗✗✗setMaskFilter()✗✗✗✗setPathEffect() (for lines)✗✗✗✗setRasterizer()✗✗✗✗setShadowLayer() (other than text)✗✗✗✗setStrokeCap() (for lines)✗✗✗✓setStrokeCap() (for points)✗✗✗✗setSubpixelText()✗✗✗✗XfermodeAvoidXfermode✗✗✗✗PixelXorXfermode✗✗✗✗PorterDuff.Mode.DARKEN (framebuffer)✗✗✗✗PorterDuff.Mode.LIGHTEN (framebuffer)✗✗✗✗PorterDuff.Mode.OVERLAY (framebuffer)✗✗✗✗ShaderComposeShader inside ComposeShader✗✗✗✗Same type shaders inside ComposeShader✗✗✗✗Local matrix on ComposeShader✗✗✗✓以上就是硬件加速对于一些绘制行为在那些API等级上支持和不支持的列表,同样的行为在不同的API等级平台上会有存在不同的情况,这是因为不同平台拥有不同的OpenGL版本。
控制硬件加速开关
引言中说过控制硬件加速可以在不同层级进行,这样可以避免因为一个绘制动作不支持而导致整个应用都不可以使用硬件加速这样很愚蠢的情况发生。总共有四个层级,从上到下是:
1. Application
应用程序等级控制硬件加速,在AndroidManifest.xml中进行:
- <application android:hardwareAccelerated="true" ...>
在Android4.0以上(包含)默认就为true,即打开。如果整个应用都不想用硬件加速,则设定为false。
2. Activity
Activity等级的控制方法还是在AndroidManifest.xml中进行,如下展示了应用整体使用硬件加速,而某一个Activity不使用的例子:
- <application android:hardwareAccelerated="true">
- <activity ... />
- <activity android:hardwareAccelerated="false" />
- </application>
3. Window
窗口级控制,如果只是想让某个窗口使用硬件加速:
- getWindow().setFlags(
- WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
- WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
4. View
可以通过代码在运行时控制单个View是否使用硬件加速:
- myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
LAYER_TYPE_HARDWARE即为使用硬件加速(GPU),LAYER_TYPE_SOFTWARE使用CPU进行绘制。
何时关闭?关闭谁?
可以通过
- View.isHardwareAccelerated()
- Canvas.isHardwareAccelerated()
- Android应用开发:图形绘制之硬件加速
- Android应用开发:图形绘制之硬件加速
- Android应用开发:图形绘制之硬件加速
- Android应用开发:图形绘制之硬件加速
- Android虚线绘制,图形硬件加速
- Android 4.0的图形硬件加速及绘制技巧
- Android 4.0的图形硬件加速及绘制技巧
- Android 4.0的图形硬件加速及绘制技巧
- Android 4.0的图形硬件加速及绘制技巧
- Android 4.0的图形硬件加速及绘制技巧(1)
- Android 4.0的图形硬件加速及绘制技巧(2)
- Android 4.0的图形硬件加速及绘制技巧(3)
- Android 4.0的图形硬件加速及绘制技巧(4)
- Android 4.0的图形硬件加速及绘制技巧(1)
- Android 4.0的图形硬件加速及绘制技巧
- Android 4.0的图形硬件加速及绘制技巧
- Android 4.0的图形硬件加速及绘制技巧
- Android 4.0的图形硬件加速及绘制技巧
- 定时任务:Handler vs Timer
- 探秘Java虚拟机——内存管理与垃圾回收
- Deep Learning in NLP (一)词向量和语言模型
- odoo8中在“更多”下拉菜单下实现简单的批量操作
- 用java写的一个图片爬虫脚本_代码分享
- Android应用开发:图形绘制之硬件加速
- Activity设置透明背景
- html的form中动态添加action
- HttpURLConnection中econnreset异常之后的理解
- 【poj 1942】Paths on a Grid 题意&题解&代码(C++)
- 在使用Poco库调试时出现异常,异常位置:EnterCriticalSection(&_cs);
- hadoop2.6伪分布式配置
- 计算机网络应用层和传输层及网络层协议有哪些?
- APM启动流程及ArduPilot函数入口