文章目录

  • 一、 背景设置产生的过度绘制
  • 二、 Android 系统的渲染优化
    • 1. 透明组件数据传递
    • 2. GPU 存储机制
    • 3. Android 7.0 之后的优化机制
  • 三、 自定义布局渲染优化

一、 背景设置产生的过度绘制


1. 背景设置产生的过度绘制 :

① 组件背景 : 每个组件每设置一次背景 , 该组件的区域就会增加一层绘制 , 如 LinearLayout 线性布局设置背景颜色 , TextView 设置背景颜色 , 都会增加该组件区域内的过渡绘制 ;

② 布局背景 : 布局文件总的背景 , 会增加一次 GPU 绘制 ;

③ 主题背景 : Activity 界面的主题背景 , 会增加一次 GPU 绘制 ;

2. 组件背景设置策略 : 不要随便为组件添加背景 , 添加一次背景 , 就增加一次 GPU 绘制 ;

不要随意给布局中的 UI 组件设置背景 , 能不设置背景的就不设置背景 , 如 ImageView 组件 , 设置一张图片 , 会增加一次绘制 , 如果再给该 ImageView 组件设置背景颜色 , 那么又会增加一次绘制 , 那么该 ImageView 组件肯定过渡绘制了 ;

二、 Android 系统的渲染优化


在 【Android 性能优化】布局渲染优化 ( CPU 与 GPU 架构分析 | 安卓布局显示流程 | 视觉与帧率分析 | 渲染超时卡顿分析 | 渲染过程与优化 ) 博客中分析了图像渲染的 16 毫秒过程中

  • CPU 渲染
  • CPU 传递数据到 GPU
  • GPU 渲染

是三大耗时操作 , 上述分析的背景过渡绘制 , 是从减少 GPU 渲染时间角度出发 , 降低图像渲染时间 ;

CPU 传递数据给 GPU 非常耗时 ;

下面分析是从 降低 CPU 传递数据到 GPU 时间 角度出发 , 进行的优化 , 这部分优化是由 Android 系统完成的 ;

1. 透明组件数据传递

Android 系统做了如下自动优化操作 , 当组件的背景是透明的 , 那么 CPU 将该组件转为多维向量图片 ( 多边形和纹理组成 ) 时发现该组件是透明的 , 该组件的图像信息就不会传递给 GPU 进行渲染 , 从而减少了 CPU 向 GPU 传递的数据大小 ; 之前讲到过 , CPU 向 GPU 传递数据也是一个非常耗时的操作 , 因此该优化 , 也降低了组件渲染的时间 ;

透明组件摆放处理 : CPU 不传递这些组件到 GPU 中 , 但是在布局中仍然正常摆放 ;

2. GPU 存储机制

1. GPU 存储纹理机制 : GPU 中的显存可以存储纹理资源 , 即多维向量图形资源 , 在渲染时 , 可以直接使用该存储的资源 , 不用每次都让 CPU 传递数据过来 ;

2. CPU 传递主题资源给 GPU 机制 : 传递主题资源是一次性传递 , 主题中的 背景 , 颜色 , 图片 ( Bitmap , Drawable ) 等资源都打包存储在了多维向量图形 ( 多边形 和 纹理 ) 中 , 传递给 GPU 进行渲染 , GPU 每次进行渲染时直接从存储区域取出这些资源 , 进行渲染 , 不再依赖 CPU 实时传递 ;

这种变化较少的资源 , 适合一次性加载 , 应用或界面的主题资源基本不会改变 ;

3. 普通的 UI 组件资源 : 如果是普通的 UI 组件 , 那么就不能只加载一次了 , 需要每次渲染时 , CPU 都要将组件加载到内存 , 并转成的多维向量图形 , 最后传递给 GPU ;

3. Android 7.0 之后的优化机制

Android 7.0 之后的优化机制 :

① 7.0 系统优化前 : Android 7.0 之前调用 UI 组件的 invalidate 方法 , 组件会回调 onLayout , onMeasure 和 onDraw 方法 ;

② 7.0 系统优化后 : Android 7.0 之后调用 UI 组件的 invalidate 方法 , 组件不会回调 onLayout 和 onMeasure 方法 , 只会调用 onDraw 方法 ;

③ 7.0 系统优化后工作机制 : 在 GPU 中缓存 UI 组件对应的多维向量图形 ( 纹理 ) , 当该组件位置或颜色等外观发生变化时 , 就会通知 CPU , 重新进行加载 , 如 onLayout 摆放 , onMeasure 测量 , 并转为多维向量图 ( 纹理 ) , 传递给 GPU 进行渲染 ; 如果没有发生变化 , 调用 invalidate 方法 , 只会在 GPU 中重新渲染 ; 不会重新 摆放 ( onLayout ) 与 测量 ( onMeasure ) ;

三、 自定义布局渲染优化


1. 自定义组件过度绘制问题描述 : 自定义控件 , 在自定义的 onDraw 方法中 , 绘制多张图片 , 如果图片之间产生重叠 , 重叠绘制的部分就出现了过度绘制 ;

2. 自定义组件绘制原则 :

① 两张图片 : 图片 AAA 和 图片 BBB ;

② 图片覆盖 : 当图片 AAA 被图片 BBB 覆盖时 , 只绘制图片 AAA 显示的部分区域 , 图片 AAA 被图片 BBB 覆盖的部分不再绘制 ;

③ 图片 AAA 只绘制没有被覆盖的部分 : 只在图片 AAA 显示的区域绘制图片 AAA 的区域 , 如下图黄色框中的区域 ;

3. 实现上述图片 AAA 在 Canvas 画布上绘制部分图片方式 :

① 完整画布 : onDraw 函数中的 Canvas canvas 参数是完整的画布 ;

② 取出图片 AAA 绘制部分的 Canvas 画布 : 这部分画布就是上图中 , 被黄色框框起来的画布 , 传入的四个参数是黄色矩形框的左上右下参数 , 注意剪切之前先保存画布 ;

// 剪切画布前 , 先保存画布 , 之后还要恢复回去
canvas.save();
// 剪切画布
canvas.clipRect(left, top, right, bottom);

③ 在剪切后的画布中绘制图片 AAA : 在剪切后的画布中 , 绘制图片 AAA , 注意绘制完成后 , 恢复画布 ;

// 在剪切后的画布中 , 绘制图片 A
canvas.drawBitmap(...);
// 绘制完毕后 , 恢复画布
canvas.restore();

④ 绘制效果 : 上述代码的绘制效果大概就是绘制了部分图片 AAA , 下图中的下面的部分图片 AAA 展示 ;

3. clipRect 函数原型 : 剪切画布 , 获取 Canvas 完整画布的子画布 , 传入左 , 上 , 右 , 下 , 四个值 , 将画布剪切出来 ;

    public boolean clipRect(float left, float top, float right, float bottom) {return nClipRect(mNativeCanvasWrapper, left, top, right, bottom,Region.Op.INTERSECT.nativeInt);}

【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )相关推荐

  1. Android Studio 4.2 中Button的Backgroud背景设置默认为蓝紫色且无法修改的问题,及Button控件中英文字母全部默认显示为大写的解决方法

    Button背景色无法修改 问题简述 在修改Button的背景颜色时,始终无法修改颜色为设置的颜色,且颜色始终为默认的蓝紫色: <Buttonandroid:id="@+id/btn_ ...

  2. 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )

    文章目录 一. GPU 过度绘制优化总结 二. CPU 渲染过程 三. CPU 渲染性能调试工具 Layout Inspector 四. Layout Inspector 组件树 DecorView ...

  3. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 自定义控件过渡绘制 | 布局文件层次深 | GPU 过渡绘制调试工具 | 背景过度绘制 )

    文章目录 一. 过度绘制 二. 过度绘制两种情况 ( 自定义控件 | 布局文件 ) 三. 过度绘制调试 1. 打开过渡绘制调试工具 2. 过渡绘制调试中不同颜色的含义 3. 过渡渲染示例 四. 背景过 ...

  4. android使用桢布局,Android性能优化UI篇

    在说性能优化之前,我们必须了解为什么要做性能优化,首先第一点肯定是为了用户体验,你想啊要是你的App用起来很卡,页面加载慢腾腾的,用户能一直忍受你吗?其二性能优化也是对我们程序员自己的考验,优化过程需 ...

  5. Android应用性能优化之优化列表头像过度绘制[一]

    为什么80%的码农都做不了架构师?>>>    操作的是否顺畅.卡顿,决定着整体的流畅程度. 事实上android跟iphone的差别,个人觉得很大程度上决定于流畅程度,无论是动画, ...

  6. Android性能优化之布局优化篇

    2019独角兽企业重金招聘Python工程师标准>>> 怎样才能写出优秀的Android App,是每一个程序员追求的目标.那么怎么才能写出一个优秀的App呢?相信很多初学者也会有这 ...

  7. Android性能优化 - 消除卡顿

    性能优化系列阅读 Android性能优化 性能优化 - 消除卡顿 性能优化 - 内存优化 性能分析工具 - TraceView Android性能分析工具 消除卡顿 什么是卡顿及卡顿的衡量标准 产生卡 ...

  8. Android 系统性能优化(30)---Android性能全面分析与优化方案研究

    Android 性能优化 1.结合以下四个部分讲解: 性能问题分类 性能优化原则和方法 借助性能优化工具分析解决问题 性能优化指标 2性能问题分类 1.渲染问题:过度绘制.布局冗杂 2.内存问题:内存 ...

  9. 几乎是史上最全最实用的Android性能全面分析与优化方案研究

    结合以下四个部分讲解: 性能问题分类 性能优化原则和方法 借助性能优化工具分析解决问题 性能优化指标 性能问题分类 1.渲染问题: 过度绘制.布局冗杂 2.内存问题: 内存浪费(内存管理).内存泄漏 ...

最新文章

  1. python个人项目-个人项目WC(Python实现)
  2. kindle词典_kindle盖泡面是什么梗?kindle官方盖章泡面盖子 网友:定位准确
  3. SAP Spartacus 里 ng-template和ng-container的嵌套使用
  4. 双系统安装ubuntu后没有windows启动项
  5. C语言入门——内功心法
  6. Luogu P4774 / LOJ2721 【[NOI2018]屠龙勇士】
  7. Linux 搭建zcash结点
  8. Golang实践录:命令行cobra库实例
  9. mysql常用sql总结_获取多个字段最大值最小值
  10. linux操作系统漏洞,常见的操作系统漏洞有哪些
  11. H.264码流解析 一个SPS的nalu及获取视频的分辨率
  12. visa虚拟卡生成器_虚拟信用卡。亲,你懂了吗?
  13. 西安电子科技大学计算机应用,西安电子科技大学计算机应用技术考研
  14. C#求学之路MVC《医院管理系统》项目研发文献
  15. 谈谈《人生七年》这部纪录片
  16. 【读书笔记】《乔布斯的魔力演讲》卡迈恩•加洛
  17. 群接龙脚本autojs总结and精美ui
  18. Macbook Pro 外接显卡实现Tensorflow GPU运行之内屏输出
  19. ppc64le处理器国产power8服务器CentOS7.2安装open-jdk
  20. linux上电自启动应用程序详解

热门文章

  1. 教你轻松恢复Linux口令
  2. legend3---3、lavarel页面post请求错误之后跳转
  3. MongoDB · 引擎特性 · MongoDB索引原理
  4. k8s nodeport下访问请求未被分发到所有node的排错(转)
  5. Redis 4.0.2分布式锁的Java实现
  6. map中的erase成员函数用法
  7. 编写一个求和函数sum,使输入sum(2)(3)或输入sum(2,3),输出结果都为5
  8. winsock 错误
  9. msp430入门学习31
  10. java.lang.Enum