文档章节

Android setLayerType 硬件加速问题

hejunbinlan
 hejunbinlan
发布于 2016/10/27 11:15
字数 1947
阅读 363
收藏 0

2014-3-3 补充:

在View的源码中有下面这样一段:

 

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. /**  
  2.    * <p>Specifies the type of layer backing this view. The layer can be  
  3.    * {@link #LAYER_TYPE_NONE}, {@link #LAYER_TYPE_SOFTWARE} or  
  4.    * {@link #LAYER_TYPE_HARDWARE}.</p>  
  5.    *  
  6.    * <p>A layer is associated with an optional {@link android.graphics.Paint}  
  7.    * instance that controls how the layer is composed on screen. The following  
  8.    * properties of the paint are taken into account when composing the layer:</p>  
  9.    * <ul>  
  10.    * <li>{@link android.graphics.Paint#getAlpha() Translucency (alpha)}</li>  
  11.    * <li>{@link android.graphics.Paint#getXfermode() Blending mode}</li>  
  12.    * <li>{@link android.graphics.Paint#getColorFilter() Color filter}</li>  
  13.    * </ul>  
  14.    *  
  15.    * <p>If this view has an alpha value set to < 1.0 by calling  
  16.    * {@link #setAlpha(float)}, the alpha value of the layer's paint is superceded  
  17.    * by this view's alpha value.</p>  
  18.    *  
  19.    * <p>Refer to the documentation of {@link #LAYER_TYPE_NONE},  
  20.    * {@link #LAYER_TYPE_SOFTWARE} and {@link #LAYER_TYPE_HARDWARE}  
  21.    * for more information on when and how to use layers.</p>  
  22.    *  
  23.    * @param layerType The type of layer to use with this view, must be one of  
  24.    *        {@link #LAYER_TYPE_NONE}, {@link #LAYER_TYPE_SOFTWARE} or  
  25.    *        {@link #LAYER_TYPE_HARDWARE}  
  26.    * @param paint The paint used to compose the layer. This argument is optional  
  27.    *        and can be null. It is ignored when the layer type is  
  28.    *        {@link #LAYER_TYPE_NONE}  
  29.    *  
  30.    * @see #getLayerType()  
  31.    * @see #LAYER_TYPE_NONE  
  32.    * @see #LAYER_TYPE_SOFTWARE  
  33.    * @see #LAYER_TYPE_HARDWARE  
  34.    * @see #setAlpha(float)  
  35.    *  
  36.    * @attr ref android.R.styleable#View_layerType  
  37.    */  
  38.   public void setLayerType(int layerType, Paint paint) {  
  39.       if (layerType < LAYER_TYPE_NONE || layerType > LAYER_TYPE_HARDWARE) {  
  40.           throw new IllegalArgumentException("Layer type can only be one of: LAYER_TYPE_NONE, "  
  41.                   + "LAYER_TYPE_SOFTWARE or LAYER_TYPE_HARDWARE");  
  42.       }  
  43.   
  44.       if (layerType == mLayerType) {  
  45.           if (layerType != LAYER_TYPE_NONE && paint != mLayerPaint) {  
  46.               mLayerPaint = paint == null ? new Paint() : paint;  
  47.               invalidateParentCaches();  
  48.               invalidate(true);  
  49.           }  
  50.           return;  
  51.       }  
  52.   
  53.       // Destroy any previous software drawing cache if needed  
  54.       switch (mLayerType) {  
  55.           case LAYER_TYPE_HARDWARE:  
  56.               destroyLayer(false);  
  57.               // fall through - non-accelerated views may use software layer mechanism instead  
  58.           case LAYER_TYPE_SOFTWARE:  
  59.               destroyDrawingCache();  
  60.               break;  
  61.           default:  
  62.               break;  
  63.       }  
  64.   
  65.       mLayerType = layerType;  
  66.       final boolean layerDisabled = mLayerType == LAYER_TYPE_NONE;  
  67.       mLayerPaint = layerDisabled ? null : (paint == null ? new Paint() : paint);  
  68.       mLocalDirtyRect = layerDisabled ? null : new Rect();  
  69.   
  70.       invalidateParentCaches();  
  71.       invalidate(true);  
  72.   }  


 

 

参考:

http://mobile.51cto.com/hot-302203.htm

http://blog.csdn.net/niu_gao/article/details/7464320

 

 

-------------------------------------------------------------------------------------------------------------------------------------------

最近听同事讨论硬件加速问题,完全不懂。于是乎,百度了下,原来从3.0开始,安卓开始支持硬件加速,手机自然是从4.0开始支持的了。而且配置方法一种是在代码中配置硬件加速,这个也分很多个级别,在minifest中;一种方式是在手机的开发人员选项中启用硬件加速,不过似乎只有google的nexus有这个选项,其它的手机都别屏蔽了。

硬件加速的官方文档:http://developer.Android.com/guide/topics/graphics/hardware-accel.html

 

开启硬件加速有两种大的途径

1.在系统设置“开发人员……”中勾选启用GPU加速

2.在应用程序中启用硬件加速

目前遇到的问题有,启用硬件加速后,WebView的性能受到一定影响,设置背景透明无效。

目前4.0的系统有硬件加速,之前的版本不太清楚。

我们来看怎样在程序中启用硬件加速

 
  1. if (VERSION.SDK_INT > VERSION_SDK_ELEVEN)
  2. {
  3. getWindow().setFlags(
  4. WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
  5. WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
  6. }

这是,Window级别的硬件加速就启动了。

对于已经在系统设置项中开启硬件加速,但是硬件加速会给应用程序带来问题的情况,可以使用如下方法为应用程序View级别取消硬件加速

 

 
  1. mView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

 

 

这里有篇非常棒的文章:

 

转载时请注明出处和作者联系方式: http://mogoweb.net mogoweb@gmail.com

本文的主要内容来自SDK文章的"Hardware Acceleration”.

从Android 3.0开始,Android的2D渲染管线可以更好的支持硬件加速。硬件加速使用GPU进行View上的绘制操作。

硬件加速可以在一下四个级别开启或关闭:

  • Application
  • Activity
  • Window
  • View

Application级别

往您的应用程序AndroidManifest.xml文件为application标签添加如下的属性即可为整个应用程序开启硬件加速:

<application android:hardwareAccelerated="true" ...>

Activity级别

您还可以控制每个activity是否开启硬件加速,只需在activity元素中添加android:hardwareAccelerated属性即可办到。比如下面的例子,在application级别开启硬件加速,但在某个activity上关闭硬件加速。

<application android:hardwareAccelerated="true">    <activity ... />    <activity android:hardwareAccelerated="false" /></application>

Window级别

如果您需要更小粒度的控制,可以使用如下代码开启某个window的硬件加速:

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

注:目前还不能在window级别关闭硬件加速。

View级别

您可以在运行时用以下的代码关闭单个view的硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

注:当前你不能在View级别启用硬加速.View层有除禁止硬加速之外的其它功能.

 

 

判定一个View是否能被硬加速

  有时一个应用了解是否启用了硬件速是很有用的,对那些自定义View之类的东西尤其重要.在你的应用做了一些不被最新的管线所支持的自定义绘制时这更加重要.

 

有两种方法可以检查应用是否被硬加速:

View.isHardwareAccelerated():如果View附加到一个硬加速的window上就返回true.

Canvas.isHardwareAccelerated():如果Canvas被硬加速了就返回true.

 

       如果你必须在你的绘制代码中做这个,应使用Canvas.isHardwareAccelerated()而不是View.isHardwareAccelerated().当一个view附加到一个硬加速的window上,它仍可以使用非硬件速的Canvas进行绘制操作.比如当为了高速缓存而把一个view画到一个bitmap中.

 

 

为什么需要这么多级别的控制?

很明显,硬件加速能够带来性能提升,android为什么要弄出这么多级别的控制,而不是默认就是全部硬件加速呢?原因是并非所有的2D绘图操作支持硬件加速,如果您的程序中使用了自定义视图或者绘图调用,程序可能会工作不正常。如果您的程序中只是用了标准的视图和Drawable,放心大胆的开启硬件加速吧!具体是哪些绘图操作不支持硬件加速呢:

  • Canvas
    • clipPath()
    • clipRegion()
    • drawPicture()
    • drawPosText()
    • drawTextOnPath()
    • drawVertices()
  • Paint
    • setLinearText()
    • setMaskFilter()
    • setRasterizer()

另外还有一些绘图操作,开启和不开启硬件加速,效果不一样:

Android的绘制模型

开启硬件加速后,Android框架将采用新的绘制模型。基于软件的绘制模型和基于硬件的绘制模型有和不同呢?

基于软件的绘制模型

在软件绘制模型下,视图按照如下两个步骤绘制:

1. Invalidate the hierarchy(注:hierarchy怎么翻译?)

2. Draw the hierarchy

应用程序调用invalidate()更新UI的某一部分,失效(invalidation)消息将会在整个视图层中传递,计算每个需要重绘的区域(即脏区域)。然后Android系统将会重绘所有和脏区域有交集的view。很明显,这种绘图模式存在缺点:

1. 每个绘制操作中会执行不必要的代码。比如如果应用程序调用invalidate()重绘button,而button又位于另一个view之上,即使该view没有变化,也会进行重绘。

2. 可能会掩盖一些应用程序的bug。因为android系统会重绘与脏区域有交集的view,所以view的内容可能会在没有调用invalidate()的情况下重绘。这可能会导致一个view依赖于其它view的失效才得到正确的行为。

基于硬件的绘制模型

Android系统仍然使用invalidate()和draw()来绘制view,但在处理绘制上有所不同。Android系统记录绘制命令到显示列表,而不是立即执行绘制命令。另一个优化就是Android系统只需记录和更新标记为脏(通过invalidate())的view。新的绘制模型包含三个步骤:

1. Invalidate the hierarchy

2. 记录和更新显示列表

3. 绘制显示列表

 

转载时请注明出处和作者联系方式: Android中的硬件加速 mogoweb@gmail.com

本文转载自:http://blog.csdn.net/shichaosong/article/details/7453778

hejunbinlan
粉丝 42
博文 596
码字总数 21569
作品 0
浦东
高级程序员
私信 提问
Android图形---硬件加速(Hardware Acceleration)(三)

不被硬件加速所支持的绘图操作 在硬件加速的时候,2D渲染管道支持大多数的通常用于Canvas的绘图操作,以及一些很少使用的操作。被用于渲染应用程序的所有的绘图操作都有发送给Android系统,默...

长平狐
2012/10/16
198
0
OS开源客户端之Android客户端错误

@红薯 你好,想跟你请教个问题: Android客户端的问题: 我使用的是2.2的API出现这三个地方出现错误。 所在类:MethodsCompat.java 出错代码: @TargetApi(11) public static void recreate...

毛祥溢
2012/09/06
2.2K
2
Android Graphics硬件加速

1.1Controlling Hardware Acceleration 从Android3.0(API Level 11)开始,Android 2D渲染管道能够更好的支持硬件加速。硬件加速执行的所有的绘图操作都是使用GPU在View对象的画布上来进行的...

android之子
2017/09/04
0
0
分享:android之hardwareAccelerated你不知道的一些问题

在Android中,可以四给不同层次上开启硬件加速: 1、Application <application android:hardwareAccelerated="true"> 2、Activity <activity android:hardwareAccelerated="true"> 3、Windo......

红豆与绿豆
2015/12/09
123
0
listView 加载图片过多,滑动时 较阻塞,如何解决?

问:listView 加载图片过多,滑动时 较阻塞,如何解决? 答:方法一:控制硬加速。你可以在以下级别上分别控制硬加速:Application、Activity、Window、View。 android:hardwareAccelerated=...

小打小闹小开小心
2015/12/12
28
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
9
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
6
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
11
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部