从Android3.0(API Level 11)开始,支持硬件加速,可充分利用GPU的特性,使得界面渲染更加平滑,但是会消耗更多内存RAM。硬件加速自身并非完美,在某些Android5的rom上,由于内存RAM分配的问题,如果代码不当,会引发闪屏、花屏等渲染问题。

硬件加速的主要原理,就是通过底层软件代码,将CPU不擅长的图形计算转换成GPU专用指令,由GPU完成。

1.Android3.0(API level 11)开始,2D渲染管道支持硬件加速,也就是说绘制操作可以使用GPU绘制在View的canvas上。使用硬件加速需要更多的资源,所以app会消耗更多内存。

2.硬件加速在Target API >= 14时是默认开启的。

3.硬件加速还不支持所有的2D绘图命令,开启后可能会影响自定义View和绘图操作。异常通常是不可见元素、运行异常、或者错误的像素点。

4.如果只使用系统的View和Drawable,则没有任何副作用。

5.如果app里有自定义的绘图操作,需要在开启硬件加速的设备上测试来发现问题。

6.可以在4个级别上控制硬件加速

①应用:(AndroidManifest.xml)

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

②Activity:(AndroidManifest.xml)

        <activityandroid:name=".MainActivity"android:hardwareAccelerated="true">

③Window:

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

④View:

 view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

在这四个层次中,应用和Activity是可以选择的,Window只能打开,View只能关闭。

7.有两种方式来检测应用是否在使用硬件加速:

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

推荐使用Canvas.isHardwareAccelerated()来检测,因为View关联到一个硬件加速的window上,仍然可以使用非硬件加速的canvas绘制。

9.View layers 
所有的Android版本View都可以在非屏幕内存(off-screen buffers)上渲染,使用view的drawing cache或者Canvas.saveLayer().非屏幕内存或者layers有许多用处,在对复杂对View做动画或者做一些叠加复合效果时可以得到更好的性能。 
在Android3.0之后可以使用View.setLayerType()来控制如何使用layers。

  • LAYER_TYPE_NONE 默认行为,正常渲染,不会在off-screen buffer上备份
  • LAYER_TYPE_HARDWARE 如果应用开启了硬件加速view渲染在硬件上,否则与LAYER_TYPE_SOFTWARE行为一样
  • LAYER_TYPE_SOFTWARE 用软件渲染在一个bitmap上

使用硬件加速有更高的效率,如果产生兼容性问题,可以用setLayerType改变渲染方式。

10.使用硬件加速在对一些view的属性改变上有更高的效率,因为不需要view的invalidate和redrawn。属性如下

  • alpha
  • x, y, translationX, translationY
  • scaleX, scaleY
  • rotation, rotationX, rotationY
  • pivotX, pivotY

对这些熟悉改变时最好使用硬件加速

        view.setLayerType(View.LAYER_TYPE_HARDWARE, null);ObjectAnimator.ofFloat(view, "rotationY", 180).start();

或者

        view.setLayerType(View.LAYER_TYPE_HARDWARE, null);ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);animator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {view.setLayerType(View.LAYER_TYPE_NONE, null);}});animator.start();

GPU和CPU:

CPU(Central Processing Unit,中央处理器)是计算机设备核心器件,用于执行程序代码,软件开发者对此都很熟悉;GPU(Graphics Processing Unit,图形处理器)主要用于处理图形运算,通常所说“显卡”的核心部件就是GPU。

下面是CPU和GPU的结构对比图。其中:

  • 黄色的Control为控制器,用于协调控制整个CPU的运行,包括取出指令、控制其他模块的运行等;
  • 绿色的ALU(Arithmetic Logic Unit)是算术逻辑单元,用于进行数学、逻辑运算;
  • 橙色的Cache和DRAM分别为缓存和RAM,用于存储信息。

  • 从结构图可以看出,CPU的控制器较为复杂,而ALU数量较少。因此CPU擅长各种复杂的逻辑运算,但不擅长数学尤其是浮点运算。

    • 以8086为例,一百多条汇编指令大部分都是逻辑指令,数学计算相关的主要是16位加减乘除和移位运算。一次整型和逻辑运算一般需要1~3个机器周期,而浮点运算要转换成整数计算,一次运算可能消耗上百个机器周期。

    • 更简单的CPU甚至只有加法指令,减法用补码加法实现,乘法用累加实现,除法用减法循环实现。

    • 现代CPU一般都带有硬件浮点运算器(FPU),但主要适用于数据量不大的情况。

  • CPU是串行结构。以计算100个数字为例,对于CPU的一个核,每次只能计算两个数的和,结果逐步累加。

  • 和CPU不同的是,GPU就是为实现大量数学运算设计的。从结构图中可以看到,GPU的控制器比较简单,但包含了大量ALU。GPU中的ALU使用了并行设计,且具有较多浮点运算单元。

  • 硬件加速的主要原理,就是通过底层软件代码,将CPU不擅长的图形计算转换成GPU专用指令,由GPU完成。

扩展:很多计算机中的GPU有自己独立的显存;没有独立显存则使用共享内存的形式,从内存中划分一块区域作为显存。显存可以保存GPU指令等信息。

硬件加速的优点:

硬件加速对渲染的流畅度有大幅提升。
在开启硬件加速后,上下拖动列表的感觉是没有跳帧的平滑拖动感,如果没有硬件加速,拖动时能感受到有丢帧。
在窗体切换动画上也类似,硬件加速开关对切换动画的影响很大。

对于video、canvas、webgl,没有硬件加速是没法商用的,Android webview里video标签里的视频如果没有硬件加速会看不到画面。

硬件加速的代价

硬件加速属于双缓冲机制,使用显存进行页面渲染(使用较少的物理内存),导致更频繁的显存操作,可能引起以下现象:
白屏、花屏、闪屏;
低RAM内存配置手机上闪退。
虽然新出的Android5.0的手机整体配置较高(显存较大),但是如果页面中使用大量图片或者过于复杂的CSS样式时同样容易出现白屏、花屏、闪屏现象。

解决硬件加速造成的问题有2个思路,1.降低页面的内存占用,给硬件加速腾出RAM;2.在适当的地方关闭硬件加速。

参考文章:

《Android硬件加速原理与实现简介》

《关于Android硬件加速技术分析》

Android 硬件加速使用总结相关推荐

  1. Android 系统(175)---Android硬件加速原理与实现简介

    Android硬件加速原理与实现简介 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到"硬件加速"这个词.由于操作系统对底层软硬件封装非常完善,上层软件开发者往往 ...

  2. Android 系统(66)---Android硬件加速相关问题总结

    Android硬件加速相关问题总结 从Android 3.0开始就支持硬件加速,充分利用GPU的特性,使得绘制View的时候更加平滑.例如在ListView(GridView)或者WebView中使用 ...

  3. [学习记录]浅谈Android硬件加速

    最近看了一些Android硬件加速的文章,因此做个记录与总结 众所周知 ,如果使用GPU进行图形绘制,就认为是硬件减速绘制:反之,则是软件绘制. 以平时开发举例,实现一个圆角矩形按钮通常有两种方案:使 ...

  4. Android硬件加速(二)-RenderThread与OpenGL GPU渲染

    Android4.0之后,系统默认开启硬件加速来渲染视图,之前,理解Android硬件加速的小白文简单的讲述了硬件加速的简单模型,不过主要针对前半阶段,并没怎么说是如何使用OpenGL.GPU处理数据 ...

  5. “Android 硬件加速与 View Layer ”知识点笔记

    阅读文章:HenCoder Android 自定义 View 1-8 硬件加速 辅助参考文章: 1.Display List构建过程分析 2.Android硬件加速原理与实现简介 3.关于硬件加速的那 ...

  6. Android硬件加速原理与实现

    一 概述 在手机客户端尤其是 Android 应用开发过程中,我们经常会接触到"硬件加速"这个概念.由于操作系统对底层软硬件封装非常完善,上层软件开发者往往对硬件加速的底层原理了解 ...

  7. android硬件加速 setLayerType

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

  8. android硬件加速默认,android 硬件加速

    这两天发现,小米1+上,图文详情老是闪退,好吧,商品详情问题还是挺多的 报错信息是: 07-24 09:59:08.601: W/crash_handler(6887): Caught a crash ...

  9. android开启加速功能,Android硬件加速开发简介

    从 Android 3.0(API Level 11)开始,Android 2D 渲染管线被设计为能更好地支持硬件加速功能. 硬件加速功能将所有在 View 组件的 Canvas 上执行的绘制操作都交 ...

最新文章

  1. Nacos 原理:推+拉打造客户端配置信息的实时更新
  2. [翻译]关于中国计算机行业未来发展不得不吐的二三事儿。信任、社区、成功故事?...
  3. spi四种工作模式时序图_SPI总线协议及SPI时序图详解
  4. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数
  5. Codeforces 899D Shovel Sale
  6. python3元类简介(metaclass)
  7. 问道五周年服务器维护公告,问道五周年 欢乐嘉年华
  8. java监听器演示样例
  9. 完美解决Win8声卡爆音破音、卡顿
  10. 数据库开发基础-教案-2
  11. 将h.264视频流封装成flv格式文件(二.开始动手)
  12. Java、JSP药品库房管理系统
  13. 传统的AD域管理存在哪些缺点?
  14. 墨刀原型图设计大全(转)
  15. [白话解析] Flink的Watermark机制
  16. 【Go】Go 错误处理
  17. 基于tauri打造的HTTP API客户端工具-CyberAPI
  18. NJR日清纺微理光R5445系列 单节锂电池保护芯片,内置驱动器高位Nch FET开关温度保护
  19. 嵌入式软件测试的10条秘诀
  20. 卫士通渠道发布会:同迎产业盛世 共享安全未来

热门文章

  1. 中国电信大数据价值挖掘:聚焦商业模式探索
  2. app推广必备功能:分享到,更多应用,创建快捷方式
  3. 取数字的个位数十位数百位数等
  4. mysql数据库常见问题及解决办法
  5. eladmin 后台管理 -- 登录
  6. 黑莓行货手机是否都有运营商(移动,电信,联通)的logo?
  7. 磁盘分区删除卷问题-如何删除EFI系统分区
  8. windows下快速实现labelImg环境配置
  9. 中国顶级程序员,从金山WPS走出来,自研了“表格编程”神器
  10. CKF MCSCKF UKF EKF滤波性能对比