Android应用开发:图形绘制之硬件加速

引言

在Android3.0后,Android的2D渲染通道开始支持硬件加速,也就是说所有View的Canvas绘画动作都会使用GPU,同时也代表着应用程序会损耗更多的内存。而在Android4.0(API14)之后硬件加速功能就被默认开启了。如果你的应用程序是由各种标准View和Drawable组成的,那么硬件加速并不会引起任何不适。众所周知,使用硬件加速会调用到OpenGL,但是OpenGL不同版本会存在不支持一些操作的情况,也就是说,硬件加速可能会影响一些自定义View及绘制过程。因此,Android系统提供了关闭硬件加速的方法,好的消息是,可以在不同层级上对硬件加速功能进行控制,而不至于整个应用程序因为某一个绘制动作的障碍而整体都不能使用硬件加速,毕竟硬件加速能够带来更加流畅、更加绚丽的界面效果。

不支持的列表

PS:列表有错位,标题向后移动一个

API level

< 16 16 17 18
Canvas
drawBitmapMesh() (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 ? ? ? ?
Paint
setAntiAlias() (for text) ? ? ? ?
setAntiAlias() (for lines) ? ? ? ?
setFilterBitmap() ? ? ? ?
setLinearText() ? ? ? ?
setMaskFilter() ? ? ? ?
setPathEffect() (for lines) ? ? ? ?
setRasterizer() ? ? ? ?
setShadowLayer() (other than text) ? ? ? ?
setStrokeCap() (for lines) ? ? ? ?
setStrokeCap() (for points) ? ? ? ?
setSubpixelText() ? ? ? ?
Xfermode
AvoidXfermode ? ? ? ?
PixelXorXfermode ? ? ? ?
PorterDuff.Mode.DARKEN (framebuffer) ? ? ? ?
PorterDuff.Mode.LIGHTEN (framebuffer) ? ? ? ?
PorterDuff.Mode.OVERLAY (framebuffer) ? ? ? ?
Shader
ComposeShader 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()

检测其是否在使用硬件加速。如果是自定义View,通过复写onDraw改变Canvas内容,那么最好的检测Canvas而非View,即使一个View被放置到了使用硬件加速的Window中,View本身及Canvas仍然可以不使用硬件加速功能。所以,在合适的位置进行关闭,关闭该关闭的那个对象很重要。

时间: 2024-10-29 04:43:55

Android应用开发:图形绘制之硬件加速的相关文章

Android OpenGL10 基本图形绘制 &lt;3&gt;

下面程序的opengl的图形是根据Opengl1.0版本API进行的. <a> : 首先绘制点: <1> : 新建一个android studio工程,这个工程参考前一篇坐标系的.工程名:PumpKinBasicGL10,主类如下: package org.durian.pumpkinbasicgl10; import android.app.Activity; import android.opengl.GLSurfaceView; import android.os.Bundl

IOS开发 图形绘制,绘制线条,矩形,和垂直和居中绘制文字

概述 吐槽下IOS下 的图形绘图,代码冗长,不得不自己重新封装方法.整理形成本文. 绘制线 // 绘制直线 + (void)toDrawLineFromX:(CGFloat)x1 Y:(CGFloat)y1 toX:(CGFloat)x2 toY:(CGFloat)y2 context:(CGContextRef)con{ CGContextMoveToPoint(con, x1, y1); CGContextAddLineToPoint(con, x2, y2); CGContextSetLi

android之各种图形绘制

Android中绘制图片或形状是我们常遇到的事情,通过最近的学习与在网上学习的案例与资料那么我今天就总结一下android中绘制用到的一些类和方法,其中其中主要包括3个类Canvas,Paint,Bitmap,这里我做的不规范,直接在主类中添加代码,如果想规范一点你们可以自定义一个View,覆写onDraw()方法,在onDraw()中进行代码的添加,先看一下效果图: 此类部分解释有借鉴:http://blog.csdn.net/rhljiayou/article/details/7212620

android之简单图形绘制

首先编写MyView类 代码如下: package com.example.myhello; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Rect; import and

Android硬件加速介绍与实现

概述 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到"硬件加速"这个词.由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解很少,也不清楚了解底层原理的意义,因此常会有一些误解,如硬件加速是不是通过特殊算法实现页面渲染加速,或是通过硬件提高CPU/GPU运算速率实现渲染加速. 本文尝试从底层硬件原理,一直到上层代码实现,对硬件加速技术进行简单介绍,其中上层实现基于Android 6.0. 硬件加速对App开发的意义 对于App开发者,简单

4.1.Android的硬件加速官方文档

参考 https://developer.android.com/guide/topics/graphics/hardware-accel.html 硬件加速背景知识 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到"硬件加速"这个词.由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解很少,也不清楚了解底层原理的意义,因此常会有一些误解,如硬件加速是不是通过特殊算法实现页面渲染加速,或是通过硬件提高CPU/GPU运算速率实现渲染加速. 本

Android HWUI硬件加速模块浅析

关键词:RenderNode,ThreadedRenderer,DisplayList,UvMapper,FontRenderer 原文:https://github.com/TsinStudio/AndroidDev 什么是硬件加速(What) 传统软件的UI绘制是依靠CPU来完成的,硬件加速就是将绘制任务交由GPU来执行.GPU相比CPU更加适合完成光栅化.动画变换等耗时任务,在移动设备上比起使用CPU来完成这些任务,GPU会更加省电些,带来的用户体验也会更佳. 为什么要硬件加速(Why)

Android——硬件加速(Hardware Acceleration(硬件加速)

从Android3.0(API Level 11)开始,Android 2D渲染管道能够更好的支持硬件加速.硬件加速执行的所有的绘图操作都是使用GPU在View对象的画布上来进行的.因为启用硬件加速会增加资源的需求,因此这样的应用会占用更多的内存. 硬件加速在target api大于等于14的情况下,是默认开启的,但是我们也可以显示的开启硬件加速.如果应用程序只使用标准的View和Drawable,那么打开全局硬件加速不会导致任何不良的绘制影响.然而,由于硬件加速并不支持所有的2D图形绘制操作,

Android--hardwareAccelerated 硬件加速详解 android:largeHeap=&quot;true&quot;

做项目时,引导页面的ViewPager报了OOM异常,图片并不大,在清单文件Application节点中添加了两行代码就解决了这个问题 android:hardwareAccelerated="false"android:largeHeap="true" 从Android3.0(API Level 11)开始,Android 2D渲染管道能够更好的支持硬件加速.硬件加速执行的所有的绘图操作都是使用GPU在View对象的画布上来进行的.因为启用硬件加速会增加资源的需求