标签:contex div hat ondraw 添加 不可 dex private 参数
Android UI性能优化
卡顿现象
1 | 渲染功能是应用程序最普遍的功能,开发任何应用程序都是这样,一方面,设计师要求为用户展现可用性最高的超然体验, |
1 | 安卓系统尝试在屏幕上绘制新的一帧,但是这一帧还没准备好,所以画面就不会刷新。如果用户盯着同一张图看了32ms而不是16ms,比如上图中前面一帧是正常渲染的,但是紧接着渲染下面 |
渲染管线
1 | Android系统的渲染管线分为两个关键组件:CPU和GPU,它们共同工作,在屏幕上绘制图片,每个组件都有自身定义的特定流程。我们必须遵守这些特定的操作规则才能达到效果。 |
1 | 在CPU方面,最常见的性能问题是不必要的布局和失效,这些内容必须在视图层次结构中进行测量、清除并重新创建, |
CPU和GPU认识
1 | 想要开发一款性能优越的应用,我们必须了解底层是如何运行的。有一个主要问题就是,Activity是如何绘制到屏幕上的?那些复杂的XML布局文件和标记语言,是如何转化成用户能看懂的图像的? |
1 | GPU使用一些指定的基础指令集,主要是多边形和纹理,也就是图片,CPU在屏幕上绘制图像前会向GPU输入这些指令,这一过程通常使用的API就是Android的OpenGL ES, |
1 | 我们要知道,一个UI对象转换为一系列多边形和纹理的过程肯定相当耗时,从CPU上传处理数据到GPU同样也很耗时。所以很明显,我们需要尽量减少对象转换的次数,以及上传数据的次数, |
1 | 上图介绍了CPU,GPU工作的主要内容,可以发现CPU主要进行的是计算,转换工作,比如布局文件的测量,布局,等,GPU主要进行栅格化的操作 |
1 | 如果我们曾经粉刷过房子,我们应该知道,给墙壁粉刷工作量非常大,如果我们需要重新粉刷,第一次的粉刷就白干了。同样的道理,我们的应用程序会因为过度绘制,从而导致性能问题, |
1 | 问题就在于此,因为每次像素经过渲染后,并不是用户最后看到的部分,这就是在浪费GPU的时间。目前流行的一些布局是一把双刃剑,带给我们漂亮视觉感受的同时,也造成过度绘制的问题, |
案例讲解,当我们打开设置中gpu的选择看下面的这个页面
1 | 上图中可以看到整个页面都存在过度绘制的情况,注意看颜色的区别,如果是浅绿色的话,就代表是多了一重绘制,如果是浅红色的话,就代表是多了俩重绘制, |
源码分析
1 | 首先看整个页面的布局文件,这里为R.layout.activity_chatum_latinum |
1 | 通过上图可以看出来,好像真的是因为多了背景的原因,因为去掉了背景之后,颜色由之前的浅绿色,变成了浅蓝色,浅蓝色代表了正常的绘制,不存在多重绘制,但是如果我们的需求就是 |
1 | 可以看到效果跟我们去掉的背景是一样的,这里我们继续查找其他的问题点 |
去掉上面多余的背景之后,显示的结果,可以看到整个页面都不存在多重绘制的情况
自定义控件剪裁作用
1 | 值得指出的是,Android系统知道过度绘制是个麻烦,Android会设法避免绘制,那些在最终图片中不显示的UI组件,这种优化类型,称作剪辑,它对UI性能非常重要。 |
案例分析
1 | 我们的代码是这样实现的,只是简单的将所有的bitmap,叠加起来,利用canvas.drawBitmap(c.bitmap,c.x,0f,paint),利用left ,top实现间隔,所以这里就造成了重叠部分的多重绘制 |
我们可以这样的优化代码
1 |
|
可以看出,优化之后,不存在多重绘制的部分
1 | 通过上图可以知道cpu主要的操作就是计算,比如我们布局文件的measure,layout等,系统的measure,layout都是从跟布局,一层一层的测量,布局,绘制的 |
Hierarchy Viewer工具
1 | Hierarchy Viewer将帮助我们快速可视化整个UI结构,另外,它还提供一个更好的方法,让我们理解这个结构内的独特视图的相对渲染性能。它看起来是这样的,让我们来进行设置。 |
当我们随便选择一个布局文件,然后点上面的三角形,就出现了下面这样的情况,有很多红,绿,黄的小圆点
1 | 三个圆点分别代表:测量、布局、绘制三个阶段的性能表现。 |
当我们点击一个布局的时候,会显示下面的内容,有测量,布局,绘制显示的时间,右边有此时当前view的属性,比如位置等
我们这里就要注意,那些显示黄色,还有红色的小圆点,看有没有办法优化他们
优化思想:查看自己的布局,层次是否很深以及渲染比较耗时,然后想办法能否减少层级以及优化每一个View的渲染时间。
上面显示的是我们listView中item的布局,我们可以发现有一些黄色,还有红色的点,我们可以优化他们,系统的就没有办法了
1 | 下面为我们每一个item的布局文件,可以发现,这里有很多重嵌套,我们完全可以去掉他们 |
1 | 优化后的代码为 |
运行的结果为
1 | 要想减少gpu的压力,我们可以利用gpu的过度范围查看器,看哪些地方是有被多重绘制的,哪些地方可以被优化的,较少不必要的多重绘制 |
标签:contex div hat ondraw 添加 不可 dex private 参数
原文地址:https://www.cnblogs.com/petewell/p/11601679.html