首页 > 代码库 > 【 Android官方文档读书笔记】硬件加速

【 Android官方文档读书笔记】硬件加速

    为了让应用在Android系统运行起来更加流畅,从3.0开始,Android 2D的绘制流程就设计为能够更好地支持硬件加速。所谓硬件加速就是使用GPU进行View上的绘制操作,从而是渲染速度更快,应用体验更加流畅。

 

1,启动硬件加速的方法

    启用硬件加速的最简单方法就是为整个系统打开硬件加速的全局设置,然而硬件加速并不支持所有2D画的操作,所以开启硬件加速可能会对使用自定义组件的应用程序造成影响,问题常常表现在不可见的元素异常和错误的像素渲染。为了解决这个问题Android可以选择启动或者禁用以下级别的硬件加速: Application 、 Activity Window 和 View 

Application级:在Android Manifest文件中的<application/> 方法中添加属性android:hardwareAccelerated="true" 

Activity级:在Android Manifest文件中,找到特定的Activity<activity/> 方法中添加属性android:hardwareAccelerated="true" 

Window级:通过代码实现,如下。在Window级,只能开启不能禁用硬件加速。

getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATEDWindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View级:通过代码实现,如下。在View级,只能禁用无法开启硬件加速。

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

 

2,Android绘制模型

Android 4.0之后,提供了两种绘制模型,一种是基于软件的绘制模型,另一种是基于硬件的绘制模型。开启硬件加速之后,会使用基于硬件的绘制模型。

基于软件的绘制模型:当一个Viewinvalidate被调用后,系统会马上重新绘制view hierarchy中与更新区域相交的View

基于硬件的绘制模型:当一个Viewinvalidate被调用后,系统不会马上去绘制,而是将其记录在显示列表中,在绘制时只更新调用了invalidateView,其他则与之前显示列表一样显示出来。

 

3,Android View的层及其分类

所有的Android版本都有能力对离屏缓冲进行渲染,或者是使用View的绘制缓冲,或者是使用Canvas.saveLayer()函数。由Android 3.0开始就能够通过View.setLayerType()方法对何时以及如何使用层有了更多的控制。一个View可以使用如下的三种layer类型之一:

LAYER_TYPE_NONE: 这个View将被按普通的方式进行渲染,但是不会返回一个离屏的缓冲,这个是默认的行为。

LAYER_TYPE_HARDWARE:如果这个应用被硬件加速的话,这个View将会在硬件中渲染为硬件纹理,如果应用程序并没有被硬件加速,则其效果和LAYER_TYPE_SOFTWARE是相同的。

LAYER_TYPE_SOFTWARE: View 通过软件渲染为一个bitmap

 

4,硬件加速的优势以及问题

Android通用的应用来说,开启硬件加速会带来以下好处:

(1)更快的渲染速度,基于硬件的绘制模型使得应用在更新View的时候,能少做一些重绘动作。

(2)更流畅的操作体验,滑屏动作、动画会更平滑。当对一个复杂的View进行动画操作时,因为要进行很多的画操作,所以并不可能总是能达到60帧每秒。在这种情况下可以通过硬件层来渲染为硬件纹理来提高性能。硬件纹理操作可以用作对一个view进行动画操作,当进行动画的时候可以减少对View自身频繁的重绘。

(3)对视频的支持更好。

 

但是开启硬件加速也会带来一些问题:

1)占用内存更多。

2)固件支持不统一,3.0以上的固件才支持,且后续版本支持的标准也不一样。

3)不支持一些特定的渲染。

【 Android官方文档读书笔记】硬件加速