性能优化之渲染优化

一、卡顿现象

Android系统每隔16ms就重新绘制一次Activity,也就是说,我们的应用必须在16ms内完成屏幕刷新的全部逻辑操作,这样才能达到每秒60帧,然而这个每秒帧数的参数由手机硬件所决定,现在大多数手机屏幕刷新率是60赫兹(赫兹是国际单位制中频率的单位,它是每秒中的周期性变动重复次数的计量),也就是说我们有16ms(1000ms/60次=16.66ms)的时间去完成每帧的绘制逻辑操作,如果错过了,比如说我们花费34ms才完成计算,那么就会出现我们称之为丢帧的情况。


性能优化之渲染优化_第1张图片
Paste_Image.png

安卓系统尝试在屏幕上绘制新的一帧,但是这一帧还没准备好,所以画面就不会刷新。如果用户盯着同一张图看了32ms而不是16ms,用户会很容易察觉出卡顿感,哪怕仅仅出现一次掉帧,用户都会发现动画不是很顺畅,如果出现多次掉帧,就会出现明显卡顿现象。

二、渲染管线

Android系统的渲染管线分为两个关键组件:CPU和GPU,它们共同工作,在屏幕上绘制图片,每个组件都有自身定义的特定流程。我们必须遵守这些特定的操作规则才能达到效果。


性能优化之渲染优化_第2张图片
Paste_Image.png

在CPU方面,最常见的性能问题是不必要的布局和失效,这些内容必须在视图层次结构中进行测量、清除并重新创建。
在GPU方面,最常见的问题是我们所说的过度绘制(overdraw),通常是在像素着色过程中,通过其他工具进行后期着色时浪费了GPU处理时间。

格栅化就是将例如字符串、按钮、路径或者形状的一些高级对象,拆分到不同的像素上在屏幕上进行显示,格栅化是一个非常费时的操作。

图像处理器(GPU显卡的处理器),GPU使用一些指定的基础指令集,主要是多边形和纹理,也就是图片,CPU在屏幕上绘制图像前会向GPU输入这些指令,这一过程通常使用的API就是Android的OpenGL ES,这就是说,在屏幕上绘制UI对象时无论是按钮、路径或者复选框,都需要在CPU中首先转换为多边形或者纹理,然后再传递给GPU进行格栅化。


性能优化之渲染优化_第3张图片
Paste_Image.png

一个UI对象转换为一系列多边形和纹理的过程肯定相当耗时,从CPU上传处理数据到GPU同样也很耗时。所以很明显,我们需要尽量减少对象转换的次数,以及上传数据的次数,幸亏,OpenGL ES API允许数据上传到GPU后可以对数据进行保存,当我们下次绘制一个按钮时,只需要在GPU存储器里引用它,然后告诉OpenGL如何绘制就可以了,一条经验之谈:渲染性能的优化就是尽可能地上传数据到GPU,然后尽可能长地在不修改的情况下保存数据,因为每次上传资源到GPU时,我们都会浪费宝贵的处理时间。

三、GPU的主要问题 -过度绘制(overdraw)

过度绘制指的是屏幕上的某个像素点在同一帧的时间内被绘制了多次。


性能优化之渲染优化_第4张图片
Paste_Image.png

问题就在于此,因为每次像素经过渲染后,并不是用户最后看到的部分,这就是在浪费GPU的时间。目前流行的一些布局是一把双刃剑,带给我们漂亮视觉感受的同时,也造成过度绘制的问题,为了最大限度地提高应用程序的性能,我们必须尽量减少过度绘制。
Android手机提供了查看过度绘制情况的工具,在开发者选项中打开


性能优化之渲染优化_第5张图片
Paste_Image.png

手机屏幕显示会出现一些异常不用过于惊慌,Android在屏幕上使用不同颜色,标记过度绘制的区域,如果某个像素点只渲染了一次,我们看到的是它原来的颜色,随着过度绘制的增多,标记颜色也会逐渐加深。

四、Hierarchy Viewer工具

Hierarchy Viewer将帮助我们快速可视化整个UI结构,另外,它还提供一个更好的方法,让我们理解这个结构内的独特视图的相对渲染性能。
开启:


性能优化之渲染优化_第6张图片
Paste_Image.png

性能优化之渲染优化_第7张图片
Paste_Image.png

性能优化之渲染优化_第8张图片
Paste_Image.png

性能优化之渲染优化_第9张图片
Paste_Image.png

我们可能注意到每个视图有三个独特的圆点,它们可能具有不同的颜色,绿色、黄色或红色。
但是,这些圆点的顺序也具有特定的含义。最左边的圆点表示渲染管道的测量阶段,中间的圆点表示布局阶段,最右边的圆点表示渲染管道的绘制阶段。
绿色表示这个管道阶段,这个视图的渲染速度快于至少一半以上的其他视图。
黄色表示它的渲染速度属于比较慢的50%,如果我们看到红色,意味着这是视图层级中最慢的节点,我们还应该知道红色节点可能是存在问题。

优化思想:查看自己的布局,层次是否很深以及渲染比较耗时,然后想办法能否减少层级以及优化每一个View的渲染时间。

你可能感兴趣的:(性能优化之渲染优化)