Android_硬件加速

来源:互联网 发布:职场霸凌 知乎 编辑:程序博客网 时间:2024/06/10 23:05

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是不支持硬件加速的。

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

不支持的 Canvas Paint 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