Android_硬件加速

Android中的硬件加速


前言

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

硬件加速的级别

  1. application
  2. activity
  3. window
  4. view

为何有多级别的硬件加速

硬件加速可以带啦性能的提升,为什么android不直接全部使用硬件加速,而是区别出来多级硬件加速呢?因为并不是所有的2D图形操作都支持硬件加速的。例如在应用中使用了自定义的视图或者绘图调用,这时使用硬件加速,应用可能会错误运行。当然了,如果只是使用标准的视图和drawable那是不会有问题的。

代码解释

  1. application和activity级别的硬件加速,可以直接在AndroidManifest.xml中进行相关的属性配置。
    application级别

    <application android:hardwareAccelerated="true" >

    activity级别

    <activity android:hardwareAccelerated="true">

    application & activity

    <application android:hardwareAccelerated="true">
        <activity android:hardwareAccelerated="false"/>
    </application>
  2. window级别(java代码中)

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
  3. view级别(关闭操作)

    mTestView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

    【注】view级别是无法打开硬件加速的,但是可以关闭,因为有很多自定义的view是不支持硬件加速的。

不支持硬件加速的绘图操作(摘录)

不支持的
CanvasPaint
clipPath()setLinearText()
clipRegion()setMaskFilter()
drawPicture()setRasterizer()
drawPosText()
drawTextOnPath()
drawVertices()
开启后效果改变
Canvas
clipRect()XOR, Difference和ReverseDifference裁剪模式被忽略,3D变换将不会应用在裁剪的矩形上。
drawBitmapMesh()colors数组被忽略
drawLines()反锯齿不支持
setDrawFilter()可以设置,但无效果
Paint
setDither()忽略
setFilterBitmap()过滤永远开启
setShadowLayer()只能用在文本上
ComposeShader
ComposeShader只能包含不同类型的shader (比如一个BitmapShader和一个LinearGradient,但不能是两个BitmapShader实例)
ComposeShader不能包含ComposeShader

补充(Android绘制模型)

开启硬件加速后,android采用新的硬件绘制模型,这里,我简要写一下:基于软件的绘制模型和基于硬件的绘制模型有的不同
基于软件的绘制模型
在软件绘制模型下,视图按照如下两个步骤绘制:
1. Invalidate the 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系统只需记录和更新标记为脏的view(invalidate())。新的绘制模型包含三个步骤:
1. Invalidate the hierarchy
2. 记录和更新显示列表
3. 绘制显示列表

转载请注明:http://blog.csdn.net/zifeng1203s/article/details/44004907

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值