最近看了一些Android硬件加速的文章,因此做个记录与总结

众所周知 ,如果使用GPU进行图形绘制,就认为是硬件减速绘制;反之,则是软件绘制。

以平时开发举例,实现一个圆角矩形按钮通常有两种方案:使用PNG图片;使用代码(XML/java)实现。

简单对比下两种方案:

方案 原理 特点
使用PNG图片(BitmapDrawable) 解码PNG图片生成Bitmap,传到底层,由GPU渲染 图片解码消耗CPU运算资源,Bitmap占用内存大,绘制慢
使用代码实现(ShapeDrawable) 直接将Shape信息传到底层,由GPU渲染 消耗CPU资源少,占用内存少,绘制快

页面渲染背景知识

  • 页面渲染时,被绘制的元素最终要转换成矩阵像素点(即多维数组形式,类似安卓中的Bitmap),才能被显示出来

  • 页面由各种基本元素组成,例如圆形,圆角矩形,线段,文字,矢量图,Bitmap等

  • 元素绘制时尤其是动画绘制的过程中,经常涉及插值、缩放、旋转、透明度变化,物理运动,多媒体文件解码等运算

  • 绘制过程经常需要进行逻辑较简单、但数据量庞大的浮点运算。

CPU与GPU结构对比

CPU(Central Processing Unit 中央处理器)是计算机设备核心器件,用于执行程序代码

GPU (Graphics Processing Unit 图形处理器) 主要用于图形计算,通常说的"显卡"的核心部件就是GPU

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

  • 黄色的为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完成。

纯软件绘制VS硬件加速(android 6.0)

下面根据具体的几种场景,具体分析一下硬件加速后的流程与加速效果。

渲染场景 纯软件绘制 硬件加速 加速效果分析
场景1.页面初始化 绘制所有View 创建所有DisplayList GPU分担了复杂计算任务
场景2.在一个复杂页面调用背景透明TextView的setText(),且调用后其尺寸位置不变 重回脏区内所有View TextView以及每一集父View冲间DisplayList 重叠的兄弟节点不需CPU重绘,GPU会自行处理
场景3.TextView逐帧播放Alpha/Translation/Scale动画 每帧都要重绘脏区内所有View 除第一帧同场景2,之后每一帧只更新TextView对应的RenderNode的属性 刷新一帧性能极大提高,动画流畅度提高
场景4.修改TextView透明度 重回脏区内所有View 直接调用RenderNode.setAlpha()更新 加速前需全页面遍历,并重绘很多View;加速后只触发DecorView.updateDisplayListlfDirty,不再往下遍历,CPU执行时间可以忽略不计

场景1中,无论是否加速,遍历View树并都会走Draw路径。硬件加速后Draw路径不做实际绘制工作,只是构建DisplayList,复杂的绘制计算任务被GPU分担,已经有了较大的加速效果。

场景2中,TextView设置前后尺寸位置不变,不会触发重新绘制Layout。

场景3中,软件绘制每一帧都要做大量绘制工作,很容易导致动画卡顿。硬件加速后,动画过程直接走DisplayList路径更新DisplayList属性,动画流畅度能得到极大提高。

场景4中,两者性能差距更明显。简单修改透明度,软件绘制仍要做很多工作;硬件加速后一般直接更新RenderNode的属性,不需要除法invalidate,也不会遍历View树(除了少数View可能要对Alpha做特殊相应并在onSetAlpha()返回true。

总结

  • CPU更擅长复杂逻辑控制,而GPU得益于大量ALU和并行结构设计,更擅长数学运算。

  • 页面由各种基础元素(DisplayList)构成,渲染时需进行大量浮点运算。

  • 硬件加速条件下,CPU用于控制复杂绘制逻辑、构建或更新DisplayList,进一步提高渲染效率。

  • 在能实现同样效果前提下,应尽量使用更简单的DisplayList,从而达到更好的性能(Shape代替Bitmap等)。

[学习记录]浅谈Android硬件加速相关推荐

  1. android fps 垂直同步,浅谈Android流畅度

    原标题:浅谈Android流畅度 哈哈 讲个故事 白 1 流畅度 关于流畅度谷歌官方给出的解释为:running at a consistent 60 frames per second, witho ...

  2. 浅谈Android中的MVP与动态代理的结合

    浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...

  3. 浅谈Android保护技术__代码混淆

    浅谈Android保护技术__代码混淆 浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读 ...

  4. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...

  5. 《浅谈-Android系统越用反应越慢的问题》

    <浅谈-Android系统越用反应越慢的问题> android应用程序和iphone应用程序不一样,用过iphone的都知道,点击图标进入程序后,如果还想用其他程序,必须先按返回退出然后进 ...

  6. 浅谈Android Architecture Components

    浅谈Android Architecture Components 浅谈Android Architecture Components 简介 Android Architecture Componen ...

  7. 浅谈Android文件管理器的几种实现方式(原理篇)--对我有帮助

    转自 https://blog.csdn.net/weixin_33698823/article/details/87269955 浅谈Android文件管理器的几种实现方式 为了完成毕业设计,我花费 ...

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

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

  9. 浅谈Android游戏开发基础和经验

    Android游戏开发基础和经验是本文要介绍的内容,主要是来了解并学习Android游戏开发的内容实例,具体关于Android游戏开发内容的详解来看本文. 做一个类似俄罗斯方块的android游戏开发 ...

最新文章

  1. 开源软件与商业软件的选择
  2. src.checkVector(2, CV_32F) == 4 dst.checkVector(2, CV_32F) ==4
  3. Android复习09【内容提供者、音乐播放器(附完整工程文件)】
  4. CentOS安装php mbstring的扩展
  5. MYC编译器源码分析之程序入口
  6. 【OOAD】OOAD概述
  7. 如何在mysql中创建过程_如何在MySQL 中创建存储过程?
  8. 第1本书:CCIE Practical Studies, Volume I-第13天
  9. 系统学习机器学习之总结(一)--常见分类算法优缺点
  10. C语言:采用交互式方式打开指定的文件,若文件打开成功,则显示该文件的大小,并显示文件内容,若文件打开失败,则提示出错信息
  11. html字体设置匹配移动端,移动端字体的设置
  12. 配置管理基本概念、配置管理计划、配置管理主要活动
  13. 《数学之美》第30章 Google大脑和人工神经网络
  14. 测试打字有什么软件是什么,打字测试软件介绍
  15. 广东电信最新DNS更新了
  16. 【从零开始学极狐gitlab】01环境搭建 #JIHULAB101
  17. Flink reduce详解
  18. 非QQ会员如何克隆好友
  19. HBASE学习使用经验
  20. 11 编程指南_流数据

热门文章

  1. Elemrnt UI DatePicker日期选择器(格式、限定日期),周选择器
  2. 数字源表LIV测试激光器方案
  3. scss 转换成css,如何将scss转换为css
  4. 扩充计算机内存是扩充什么,怎么增加电脑内存 三种方法让你电脑内存扩大
  5. 前端Mocha+Chai单元测试
  6. 机房动环监控系统方案组成及应用
  7. File Provider
  8. 审批流程设计方案-介绍(一)
  9. 两分钟带你彻底明白机器学习中的过采样和欠采样是什么意思?
  10. 8.1 Kotlin Sealed类