转载时请注明出处和作者联系方式: 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级别开启硬件加速

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

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

  • Canvas

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

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

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

    如果应用程序受到这些影响,您可以在受影响的部分调用setLayerType(View.LAYER_TYPE_SOFTWARE, null),这样在其它地方仍然可以享受硬件加速带来的好处

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中的硬件加速相关推荐

  1. 一文读懂,Android中的硬件加速

    /   今日科技快讯   / 近日,携程发布<2023年春节旅游总结报告>.报告显示,春节期间国内外旅行订单皆迎来三年巅峰,旅游订单整体较虎年春节增长4倍.同时,春节期间出境游整体订单同比 ...

  2. Android中使用硬件加速的技巧

    http://www.uzzf.com/news/2060.html 从Android 3.0开始,Android 2D的绘制流程就设计为能够更好地支持硬件加速.使用GPU的View在Canvas上进 ...

  3. “一文读懂“系列:Android中的硬件加速

    浅谈 前几天有个朋友问我"了不了解关于手机硬件加速方面的知识?",嗯?其实我也想知道... 于是笔者就去网上搜罗了文章再结合自己对源码的理解,总结了这篇关于硬件加速的理解. 关于屏 ...

  4. android关闭硬件动画加速器,Android中的硬件加速

    从Android 3.0开始,Android的2D渲染管线可以更好的支持硬件加速.硬件加速使用GPU进行View上的绘制操作. 硬件加速可以在一下四个级别开启或关闭: Application Acti ...

  5. android硬件加速导致绘制,Android中的硬件加速

    2012-09-18 14:47 12567人阅读 评论(0)  分类: Android(54)  工作(53) 转载时请注明出处和作者联系方式: http://mogoweb.net mogoweb ...

  6. Android中禁用硬件加速的几种方式

    禁用硬件加速度 Android提供了四中级别的禁用硬件加速度的方式: Application 对整个应用禁用硬件加速度 在AndroidManifest.xml中为application标签添加如下属 ...

  7. Android渲染--重温硬件加速上

    Android中绘图的API很多,比如2D的基于Skia的接口,3D的绘图OpenGLES,Vulkan等.Android早期系统多数都是采用2D的绘图模式,比如绘制一张Bitmap图片.随着用户对视 ...

  8. android开发 硬件加速,Android 开发之硬件加速

    (1)定义 所谓硬件加速,指的是把某些计算工作交给专门的硬件来做,而不是和普通的计算工作一样交给 CPU 来处理.这样不仅减轻了 CPU 的压力,而且由于有了专门硬件的处理,这份计算工作的速度也被加快 ...

  9. android 自定义view 硬件加速,Android自定义View(八) -- 硬件加速

    Android自定义View(八) – 硬件加速 今天学习自定义View部分的最有一篇:硬件加速因为无法录制GIF,所以本篇内容基本为原博 本文计划根据HenCoder系列文章进行学习,所以代码风格及 ...

最新文章

  1. ionice使用说明与参数详析
  2. audio 上一首 下一首 自定义样式_我们的歌:盛典即将来临,勤深深还有一首歌,这场表演值得期待...
  3. Http 与 Socket 区别
  4. 测试Live Writer
  5. php time 循环不变,PHP为系统调用的脚本设置超时,set_time_limit不起作用
  6. Linux软件安装解决方案
  7. mysql 主表存hash和子表的名字_【mysql】mysql分表和表分区详解
  8. 外媒:苹果明年上半年推出iPhone SE 3 支持5G搭载A14处理器
  9. 数据结构之删除线性表中的元素
  10. Java编程中组合、继承和代理的区别
  11. XML的四种解析器原理及性能比较
  12. 你好旧时光,斗罗大陆,红楼梦词云词频分析(动词形容词名词)
  13. oracle新增字段,并设置默认值
  14. java会员消费管理系统源码_基于jsp的会员消费商场vip管理系统-JavaEE实现会员消费商场vip管理系统 - java项目源码...
  15. 朋友圈爱心拼图php源码_朋友圈爱心形配图怎么弄 微信朋友圈九宫格心形拼图教程方法...
  16. 问题描述:the jar file jrt-fs.jar has no source attachment
  17. 人工智能专业适合女孩学习吗?
  18. GridView中动态生成ItemTemplate模板列
  19. 交换a,b值的三种方法
  20. 自发和诱发电生理活动之间的动态关系

热门文章

  1. apple tv 开发_现在是购买Apple TV的好时机吗?
  2. 原装应广单片机 MCU芯片PMS152 SOP8封装 单片机开发
  3. 振动方程线性多步法C语言,振动方程的线性多步法数值求解.pdf
  4. linux之SECURITY(安全)一
  5. 仿PS3游戏《战神》连击动作解析
  6. [转载]哈佛经典——《管理自己》
  7. 遭遇难缠的病毒群ntldr.exe和c0nime.exe等,可杀
  8. 综合门户html模版,简约时尚门户网站html静态模板 - 我爱模板网 www.5imoban.net
  9. poi对word2003或者2007的图片读取和写入操作
  10. 计算机应用基础奥鹏2021,2021奥鹏计算机应用基础《Word 大作业》离线作业.docx