Android 3.0硬件加速功能
摘自:Android 3.0 Hardware Acceleration
作者:Romain Guy
在android 3.0中一个改动大的新特性是增加了管道渲染的功能。它能让开发者的应用可以通过Android提供的2D图像硬件加速技术运行更加流畅。其实硬件加速对于Android平台来说不算是新特性了。比如在windows和OpenGL游戏等早已使用了该技术。但是通过这项技术可以让Android应用运行更为流畅。在Motorola Xoom设备上,所有的系统标准配备应用比如浏览器,日历等都使用了2D硬件加速功能。
在接下来的这篇文章中,我将向你描述如何在你的应用中使用硬件加速这一技术。
更快
首先,你需要在你的AndroidManifest.xml文件中的<application/>节点下添加如下的属性:
android:hardwareAccelerated="true"
Note:如果你应用程序中使用的控件是系统标准的控件,如果要想使用硬件加速,这项声明就是必须的。一旦你开启了硬件加速功能之后,所有在画布上执行的绘图操作,都将使用GPU。
如果你使用的是自定义的控件,你还需要做一些其他额外的操作来开启硬件加速的功能。这也是在默认的情况下,硬件加速功能没有开启的原因之一。
控制硬件加速
因为渲染管道自身的一些特性限制,在你的应用中可以存在一些问题,问题通常主要表现为你的控件元素消失,程序中异常,或者是控件外观看起来不正常。为了帮你解决这一问题,android提供了4中不同的方式来控制硬件加速,你可以在如下的类中开启或者是关闭程序的硬件加速功能:
- Application
- Activity
- Window
- View
在<application>或者是<activity>层开启或者是关闭硬件加速功能,你可以在AndroidManifest xml文件中提前声明。比如如下的声明,就是在application层次去开启硬件加速功能而在应用的某一个activity中关闭这一功能:
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
当然了,如果你想更精准的控制这一特性,你可以在acitivty运行时,在Onreate()方法中声明如下标识来告诉系统,当前的这个窗口开启了硬件加速的功能:
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
Note:在View级别,你也可以关闭硬件加速的功能(译者注:SDK版本为11以后),通过如下的方式:
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
是否使用了硬件加速
有些时候,特别是使用了自定义控件,在应用程序中判断是当前的控件是否使用了硬件加速也很有必要。比如你的在应用程序中大量使用自定义View,但事实是并不是所有的操作新的渲染管道都支持。
通常有两种方法来判断是的应用是否是使用了硬件加速API如下:
View.isHardwareAccelerated()
, 如果返回true,就说明view附加到的窗口使用了硬件加速Canvas.isHardwareAccelerated()
, 如果返回true,就说明Canvas画笔工具使用了硬件加速
如果确实有必要判断在你的绘图代码中是否使用了硬件加速,强烈推荐你使用第二种方式,因为,尽管一个view添加到了一个开启了硬件加速的窗口上,但是,绘制View的Canvas却很有可能并没有开启硬件加速。这种情况通常发生在为了缓存的目的,你需要把一个View画到bitmap中的情况。
哪些绘图操作受支持
硬件加速技术支持目前绝大多数的绘图操作,我们实现了所有需要渲染内置程序的操作,所有默认的控件和布局,和常见的高级视觉效果(反射,平铺纹理等)。但是依然有一些操作不受支持,或者在android之后的某些版本中可能支持:
-
Canvas
clipPath
clipRegion
drawPicture
drawPoints
drawPosText
drawTextOnPath
drawVertices
-
Paint
setLinearText
setMaskFilter
setRasterizer
附加的,一些操作在开启了硬件加速之后可能会有所不同的表现比如:
-
Canvas
-
clipRect
:XOR
,Difference
andReverseDifference
clip modes are ignored; 3D transforms do not apply to the clip rectangle -
drawBitmapMesh
: colors array is ignored -
drawLines
: anti-aliasing is not supported -
setDrawFilter
: can be set, but ignored
-
-
Paint
-
setDither
: ignored -
setFilterBitmap
: filtering is always on -
setShadowLayer
: works with text only
-
-
ComposeShader
- A
ComposeShader
can only contain shaders of different types (aBitmapShader
and aLinearGradientShader
for instance, but not two instances ofBitmapShader
) - A
ComposeShader
cannot contain aComposeShader
- A
即使在你的绘图代码中如果某些操作因为上述的API限制使View受到了影响。你也不必因此不在整个应用程序使用硬件加速的优势。作为替代方案,你可以考虑把有可能出问题的view或者是bitemap设置为不开启硬件加速,通过设置属性LAYER_TYPE_SOFTWARE。
用或者不用
使用硬件加速对你用程序程序中提高动画流畅性和运行速度来说确实很有空,但是并不是唯一的妙法。应用程序的设计和实现必须对GPU来说很友好。遵循如下的方式,你会发现这其实很简单:
1:减少你应用程序中View的个数 :系统需要绘制越多的view,程序就会越慢。所以这个原则对优化程序UI来说也很有用。