1.过渡绘制

Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的UI结构里面,如果不可见的UI也在做绘制的操作,会导致某些像素区域被绘制了多次。这样就会浪费大量的CPU以及GPU资源。

当设计上追求更华丽的视觉效果的时候,我们就容易陷入采用越来越多的层叠组件来实现这种视觉效果的怪圈。这很容易导致大量的性能问题,为了获得最佳的性能,我们必须尽量减少Overdraw的情况发生。

幸运的是,我们可以通过手机设置里面的开发者选项,打开Show

GPU Overdraw的选项,可以观察UI上的Overdraw情况。

蓝色,淡绿,淡红,深红代表了4种不同程度的Overdraw情况,我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。

产生的主要原因是:

不必要的背景颜色或背景图片

被遮挡的不可见部分

2.不必要的背景色或背景图片

通过一个例子,我们可以学习到怎样优化,可以从github下载源码

优化前后对比

主要优化点:

设置window的背景为null//The Theme's windowBackgroud is masked by the opaque backgroud of the activity,and

//the windowBackgroud causes an unnecessary overdraw.Nullifying the windowBackgroud

//removes the overdraw.

getWindow().setBackgroundDrawable(null);复制代码

清除xml不必要的background

按需显示占位背景图片// Display the chat author's avatar (a droid image) and a background color associated with

// the author.

if(chat.getAuthor().getAvatarId()==0){

Picasso.with(getContext()).load(android.R.color.transparent).into(chat_author_avatar);

chat_author_avatar.setBackgroundColor(chat.getAuthor().getColor());

}else{

Picasso.with(getContext()).load(chat.getAuthor().getAvatarId()).into(chat_author_avatar);

chat_author_avatar.setBackgroundColor(Color.TRANSPARENT);

}复制代码

3.被遮挡的不可见部分

Android系统知道过度绘制是个问题,它会设法避免绘制那些最终被遮挡而不显示的UI组件。这种优化叫做剪辑(clipping)。

但是不幸的是,对于那些过于复杂的自定义的View(通常重写了onDraw方法),Android系统无法检测在onDraw里面具体会执行什么操作,系统无法监控并自动优化,也就无法避免Overdraw了。但是我们可以通过canvas.clipRect()来帮助系统识别那些可见的区域。这个方法可以指定一块矩形区域,只有在这个区域内才会被绘制,其他的区域会被忽视。这个API可以很好的帮助那些有多组重叠组件的自定义View来控制显示的区域。同时clipRect方法还可以帮助节约CPU与GPU资源,在clipRect区域之外的绘制指令都不会被执行,那些部分内容在矩形区域内的组件,仍然会得到绘制。

除了clipRect方法之外,我们还可以使用canvas.quickreject()来判断是否没和某个矩形相交,从而跳过那些非矩形区域内的绘制操作。

通过一个例子,我们可以学习到怎样优化,可以从github下载源码。运行代码,可以看到如下图,这是一个层叠卡片的自定义view。被上层卡片覆盖的下层卡片依然绘制了,才产生红色过渡绘制提示。

优化前onDraw方法

下面的代码显示了如何通过clipRect来解决自定义View的过度绘制,提高自定义View的绘制性能:

下面是优化过后的效果:

另外欢迎关注我的:

Github

微博

掘金

微信公众号

蛋妞码农

android过渡渲染,android 性能优化 - 渲染 - 过渡绘制相关推荐

  1. Android 进阶第二篇——性能优化

    Android 进阶第二篇--性能优化 一些Android书籍喜欢把性能优化放在最后的章节,简单提一提作为内容全面的点缀.在这里我将工具使用和性能优化的一些个人经验放在进阶系列博客的开始,因为我认为防 ...

  2. vue渲染大量数据如何优化_加速vue组件渲染之性能优化

    背景 平时在用vue开发后台管理系统的时候,应该会用到大量的table这种组件,正常这种组件我们会在项目里做二次封装,然后针对表头title做参数化配置,如下: export default { da ...

  3. 前端性能优化--渲染优化

    前端性能优化–渲染优化 文章目录 前端性能优化--渲染优化 前言 1.HTML解析过程 2.性能优化:减少重排 3.减少重绘(repaint) 尽量使用这些css属性可以减少页面的重绘 will-ch ...

  4. Android系统开发和性能优化——查漏补缺【建议收藏】

    做了这么久性能相关的工作,也接触了不少模块,说实话要做好性能这一块,真心不容易.为什么这么说? 是因为需要接触的知识实在是太多了, Android 是一个整体,牵一发而动全身,不是说只懂一个模块就可以 ...

  5. js重新渲染div_前端工程师必备:从浏览器的渲染到性能优化

    文章来自:华为云开发者社区 摘要:本文主要讲谈及浏览器的渲染原理.流程以及相关的性能问题. 问题前瞻 1. 为什么css需要放在头部? 2. js为什么要放在body后面? 3. 图片的加载和渲染会阻 ...

  6. 【华为云技术分享】前端工程师必备:从浏览器的渲染到性能优化

    摘要:本文主要讲谈及浏览器的渲染原理.流程以及相关的性能问题. 问题前瞻 1. 为什么css需要放在头部?2. js为什么要放在body后面?3. 图片的加载和渲染会阻塞页面DOM构建吗?4. dom ...

  7. iOS之从OpenGL深入探究离屏渲染及性能优化

    一.探究内容 到底什么是离屏渲染?是在GPU上面还是CPU上面执行的? 为什么要有离屏渲染?什么情况下会产生离屏渲染? 帧缓冲区是什么?当前屏幕缓冲区和屏幕外缓冲区又是什么? 切换缓冲区是什么操作?真 ...

  8. Android开发中的性能优化(摘录:陈彧堃演讲实录)

    大家好!我是陈彧堃,其实HTML5我之前也做过一些相关的研究,包括现在我们也在做一些调研.我个人一年前在G3上利用HTML5开发一些东西的时候,我发现原生的对HTML不支持,开始踏踏实实做Androi ...

  9. 【优化】1141- 网页渲染性能优化 —— 渲染原理

    作者:晨风明悟 链接:https://zhuanlan.zhihu.com/p/39879808 渲染原理 在讨论性能优化之前,我们有必要了解一些浏览器的渲染原理.不同的浏览器进行渲染有着不同的实现方 ...

最新文章

  1. HDU - 3078 Network 倍增LCA
  2. 好程序员大数据技术分享:Zookeeper集群管理与选举
  3. python安装第三方库的三种方法
  4. AKKA框架持久化入门样例
  5. wpf 语音通话_WPF+WCF一步一步打造音频聊天室(三):语音聊天
  6. 从ubuntu启动,而且找不到win10启动项!
  7. dp 与px互相转换
  8. 设计方案,拿来吧你!
  9. 多线程下HttpContext.Current 的问题
  10. 二分算法模板及oj练习题题解
  11. arm 添加 samb 文件共享
  12. 三维点云配准方法(两帧)
  13. 开发内功修炼CPU篇
  14. node-red 可视化_可视化和注意-第4部分
  15. Python pip安装 win32com模块
  16. 西普实验吧CTF-Hashkill
  17. Qt嵌入式开发的基本认识
  18. Bluetooth技术学习笔记 ——蓝牙核心系统架构
  19. 电流、电压、电阻、电容、电感的通俗理解
  20. 华为OD机试(A、B卷)、机考,200分的题目整理如下,冲满分必备

热门文章

  1. java游戏笑傲_快乐家族-笑傲武林
  2. vue处理图片添加水印
  3. 泰山版!Java开发手册开放下载
  4. 电磁分析matlab,MATLAB电磁场与电磁波应用分析.doc
  5. php控制硬件电源开关模块,如何使用纯CSS实现电源开关控件(附源码)
  6. 2022年最新CKA官方备考浏览器书签与2022年最新CKA考试题库大全
  7. 校园智能打铃软件介绍
  8. 方盒滤波器和均值滤波器(python实现)
  9. 【细品架构10/100】架构由术至道的转变(1)
  10. Stm32 一键下载电路详解