前言

    我们平时在开发Android的时候,经常会接触到硬件加速这个词,因为我们一般都是在应用层做开发,几乎不怎么接触硬件,其实操作系统已经把底层硬件封装的很完善了,我们并不需要去写C语言就能开启硬件加速。开启硬件加速其实非常简单

  1. 从Android 3.0(API级别11)开始,Android 2D渲染管道支持硬件加速,这意味着在View画布上执行的所有绘图操作都使用GPU。由于启用硬件加速所需的资源增加,您的应用程序将消耗更多的RAM。

  2. 如果您的目标API级别>=14,则默认情况下启用硬件加速,但也可以显式启用。如果您的应用程序仅使用标准视图和Drawable,则将其全局打开不应导致任何不利的绘图效果。但是,由于所有2D绘图操作都不支持硬件加速,因此将其打开可能会影响某些自定义视图或绘图调用。问题通常表现为不可见的元素,例外或错误渲染的像素。为了解决这个问题,Android允许在多个级别启用或禁用硬件加速。请参阅控制硬件加速。

控制硬件加速有四个级别:

  1. Application
  2. Activity
  3. Window
  4. View

Application开启硬件加速方式:

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

Activity开启硬件加速方式

<activity android:hardwareAccelerated="false" />

Window开启硬件加速方式

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

View关闭硬件加速方式

可以关闭View级别的硬件加速,但是不能在View级别开启硬件加速因为它依赖其它的设置

mView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

获取是否支持硬件加速方法

 //returns true if the View is attached to a hardware accelerated window
View.isHardwareAccelerated()
// returns true if the Canvas is hardware accelerated
Canvas.isHardwareAccelerated()

软件绘制模型

    当应用中需要更新某部分UI时,将会去调用已经内容已经更改的View的invalidate(),这个通知View刷新的消息会传遍整个View的树层(android中View的视图是树形结构)来计算需要从新绘制的区域,这个区域一般称为脏区。这种模型有两种缺点

  1. 这种模型将会执行很多代码,比如某个TextView内容改变了,需要调用TextView的invalide()方法来刷新TextView,虽然我们只需要刷新TextView,但是实际上不仅仅刷新了TextView,还刷新了TextView的父控件,同理,也会刷新父控件的父控件。刷新以为着要重新执行onDraw()方法,会执行很多代码。
  2. 第二个缺点是可能会隐藏bug,因为系统会从新绘制与脏区域交叉的区域,即使你没有调用invalidate()方法,这种情况下,你依赖于另外的view刷新触发invalidate来刷新自己,但是应用程序在修改,这种情况可能会发生改变,所以因该在无论什么时候,修改了影响视图和数据的代码,我们因该在我们自定义的View中主动调用invalidate()。

硬件加速绘图模型

    Android系统仍然使用invalidate()和draw()来请求屏幕更新和渲染视图,但是以不同的方式处理实际的图形。 Android系统不是立即执行绘图命令,而是将它们记录在包含视图层次结构的绘图代码输出的显示列表中。另一个优化是Android系统只需要记录和更新由invalidate()调用标记为脏的视图的显示列表。没有失效的视图可以通过重新发布之前记录的显示列表重新绘制。新的绘图模型包含三个阶段:

  1. 使层次结构无效
  2. 记录和更新显示列表
  3. 绘制显示列表

    在硬件加速模型中,就不能依赖与脏区域相交的视图来执行draw()方法。为了确保Android系统记录视图的显示列表,您必须调用invalidate()。忘记这样做会导致视图看起来是相同的,即使它已被改变。
使用显示列表也有利于动画性能,因为设置特定属性(如alpha或旋转)不需要使目标视图无效(自动完成)。此优化还适用于具有显示列表的视图(应用程序硬件加速时的任何视图)。例如,假设有一个LinearLayout包含Button上方的ListView。
    LinearLayout的显示列表如下所示:
    DrawDisplayList(ListView控件)
    DrawDisplayList(按钮)
    现在假设你想改变ListView的不透明度。在ListView上调用setAlpha(0.5f)后,显示列表现在包含这个:
    SaveLayerAlpha(0.5)
    DrawDisplayList(ListView控件)
恢复
    DrawDisplayList(按钮)

ListView的复杂绘图代码没有执行。相反,系统只更新了更简单的LinearLayout的显示列表。在未启用硬件加速的应用程序中,列表及其父项的绘图代码将再次执行。

限制

    开启硬件加速,可以提高程序的绘制效率,提高内容改变时的刷新效率。但是硬件加速不是有百利而无一害的,它还是有它所限制的地方。受到GPU绘制方式的限制,Canvas有些方法在硬件加速开启的时候会失效或者无法正常工作,

总结

  1. 硬件加速就是使用GPU来代替CPU完成绘制的计算工作,它从工作分摊,和绘制机制优化来提升绘制速度。

  2. 如果我们在自定义View的时候,绘制操作不支持硬件加速,那么我们可以在自定义View中手动关闭硬件加速。

view.setLayerType(LAYER_TYPE_SOFTWARE, null); 

参数
     1. 参数为 LAYER_TYPE_SOFTWARE 时,使用软件来绘制 View Layer,绘制到一个 Bitmap,并顺便关闭硬件加速。
     2. 参数为 LAYER_TYPE_HARDWARE 时,使用 GPU 来绘制 View Layer,绘制到一个 OpenGL texture(如果硬件加速关闭,那么行为和 VIEW_TYPE_SOFTWARE 一致)。
    3. 参数为 LAYER_TYPE_NONE 时,关闭 View Layer。

  View Layer 可以加速无 invalidate() 时的刷新效率,但对于需要调用 invalidate() 的刷新无法加速。
  View Layer 绘制所消耗的实际时间是比不使用 View Layer 时要高的,所以要慎重使用。

Android 开发中使用硬件加速相关推荐

  1. android开发中使用硬件加速有什么用,Android 开发中使用硬件加速

    前言 我们平时在开发Android的时候,经常会接触到硬件加速这个词,因为我们一般都是在应用层做开发,几乎不怎么接触硬件,其实操作系统已经把底层硬件封装的很完善了,我们并不需要去写C语言就能开启硬件加 ...

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

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

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

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

  4. 浏览器中支持硬件加速

    1 什么是硬件加速 硬件加速是指,应用程序使用计算机硬件的能力,比软件实现的功能能够更有效地执行某些操作.在 Chrome/Chromium 浏览器中,硬件加速能够利用计算机的图形处理单元(GPU)来 ...

  5. Android开发中常见的设计模式

    对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的 ...

  6. android权限--android开发中的权限及含义(下)

    android权限--android开发中的权限及含义(下) android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权 ...

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

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

  8. Android不同层次开启硬件加速的方式和关闭硬件加速

    > 硬件加速 -- 硬件加速的主要原理,就是通过底层软件代码,将CPU不擅长的图形计算转换成GPU专用指令,由GPU完成.在Android中,大多数应用的界面都是利用常规的View来构建的(除了 ...

  9. 浅谈Android开发中的NFC功能

    目录 1."NFC"的自我描述 1.1 NFC功能的基本概念 1.2 NFC功能的背景.特性及发展趋势 2.NFC的基础知识.基本原理 2.1 NFC的工作模式 2.2 实现NFC ...

最新文章

  1. 模板 - 判断负环(超时高效优化技巧)、01分数规划
  2. RHEL5.5 安装 oracle 11g
  3. 【Android 安全】DEX 加密 ( 不同 Android 版本的 DEX 加载 | Android 8.0 版本 DEX 加载分析 | Android 5.0 版本 DEX 加载分析 )
  4. CC2530-Zstack 协议栈MAC层中的mac_rx.c程序解读
  5. OpenGL材质Materials
  6. MemSQL初体验 - (2)初始化测试环境
  7. 数据结构_二叉树遍历
  8. Spark 配置指南
  9. 安装QQ、TIM提示:安装包可能被非法改动导致安装失败,请从官网下载最新安装包重新安装
  10. 在线AES加密/解密工具
  11. Charles——charles代理菜单proxy总结—— 开始/暂停模拟慢网速—— stop/start throttling 和 throttling settings...
  12. 华为p60pro和mate50pro哪个好 华为p60pro和mate50pro参数对比
  13. p语言是python吗-p语言是python吗
  14. 《搜索》— NYOJ 82 迷宫寻宝(一)
  15. 武汉公办专科学校以计算机为特长,专业计算机技术公办学校
  16. 港联证券:为什么会出现股票跌停?股票跌停应该怎么卖出?
  17. Vmware更新为16后,原本正常使用的虚拟机网络不通
  18. 物理学生物学计算机科学,生物物理学
  19. HTML怎么设置下划线及去掉下划线
  20. QYT-X1S在高速公路可视化的网络解决方案

热门文章

  1. Web前端学习笔记(3)
  2. 互联网须知:IT 运维工程师的主要工作是干什么?快准备好!
  3. 数据库 字段长度_全美都在用的大型肿瘤数据库,教你用别人的数据搞定一篇SCI...
  4. 上海交易所新股申购规则
  5. Java各类型数的进制转换
  6. 计算机错误代码字母,电脑开机蓝屏英文字母的解决方法
  7. mysql查询persons表中是否存在_Sql语句的一些事(一)
  8. 第二届传智杯初赛B题 贪心算法橙子问题
  9. C#中internal关键字
  10. 【蓝桥杯】 算法训练 数字三角形