Android 过渡绘制检测和部分解决方法

过渡绘制

1.什么是过渡绘制

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


原色:没有过度绘制
蓝色:1 次过度绘制
绿色:2 次过度绘制
粉色:3 次过度绘制
红色:4 次及以上过度绘制

会造成什么问题?

加载页面是会大量消耗GPU,导致渲染时间延长,手机卡顿不流畅。

2.绘制限制

手机屏幕由很多像素点组成,通过变换每个像素点的颜色,形成各种各样的图像。那么每个像素点的色值数据保存在哪里?

GPU控制的一块缓冲区中,这块缓冲区叫做Frame Buffer(也就是帧缓冲区)。可以简单理解成一个二维数组,数组中的每一个元素对应着手机屏幕上的一个像素点,元素的值代表着屏幕上对应的像素点要显示的颜色。优化屏幕画面不断变化,需要这个buffer不断地更新数据,一个FrameBuffer肯定是应接不暇的,因此GPU除了Frame Buffer,用以交给手机屏幕进行绘制外,还有一个缓冲区,叫Back Buffer,这个Back Buffer 用以交给你的应用,让你往里面填充数据。GPU会定期交换Back Buffer和Frame Buffer,也就是让Back Buffer 变成Frame Buffer交给屏幕进行绘制,让原先的Frame Buffer变成Back Buffer交给你的应用进行绘制。交换的频率也是60次/秒,这就与屏幕硬件电路的刷新频率保持了同步。

上面说了刷新频率是1000/60hz = 16ms,这就要求CPU和GPU每秒要有处理60帧的能力,一帧花费的时间在16ms内。因此屏幕刷新的全部逻辑操作也需要在16ms内完成,否则就会出现画面丢失造成卡顿。

3.检测工具

  1. 手机检测
    在手机中的设置—>开发者选项—>调试GPU过渡绘制
    Android 过渡绘制检测和部分解决方法_第1张图片

  2. Android Studio的HierarchyViewer
    Android 过渡绘制检测和部分解决方法_第2张图片

Android 过渡绘制检测和部分解决方法_第3张图片

4.部分解决办法

1、去掉window背景
Android自带的主题有些会有个纯色背景,如果我们程序有自己的背景,那么这个window的背景是不需要的。去掉window的背景可以在onCreate()中setContentView()之后调用
getWindow().setBackgroundDrawable(null);

或者在theme中设置

android:windowbackground="null"
2、去掉其他重复背景或被完全遮挡的背景

有时候为了方便会先给Layout设置一个整体的背景,再给子View设置背景,这里也会造成重叠,如果子View宽度mach_parent,可以看到完全覆盖了Layout的一部分,这里就可以通过分别设置背景来减少重绘。再比如如果采用的是selector的背景,将normal状态的color设置为“@android:color/transparent”,也同样可以解决问题。

3、ViewStub懒加载布局
4、 约束布局ConstraintLayout
5、include标签

参考链接

https://blog.csdn.net/xsf50717/article/details/78444047
https://blog.csdn.net/crazymo_/article/details/78742884

你可能感兴趣的:(Android,studio,过渡绘制)