Android 优化之减少过度绘制

概念

过度绘制是指系统在渲染单个帧的过程中在屏幕上绘制某个像素。例如有若干个界面卡片堆叠在一起,每张卡片都会遮盖其下面一张卡片的部分内容。但是,系统仍然需要绘制堆叠中的卡片被遮盖的部分。这是因为堆叠的卡片是根据画家算法(即从后到前的顺序)来渲染的。按照这种顺序,系统可以将适当的透明度混合应用于阴影之类的半透明对象。

GPU 过度绘制调试工具

开启开发者模式——>硬件加速渲染——>开启调试 GPU 过度绘制。Android 将如下方式为界面着色,以确定过度绘制的次数:

  • 真彩色:没有过度绘制
  • 蓝色:过度绘制 1 次
  • 绿色:过度绘制 2 次
  • 粉色:过度绘制 3 次
  • 红色:过度绘制 4 次或者更多次。

减少过度绘制的方法

  • 移除布局中不需要的背景
    默认情况下,布局没有背景,这表示布局本身不会直接去喧嚷任何内容。但是,当布局具有背景时,其可能会导致过度绘制。移除不必要的背景可以快速提高渲染性能。不必要的背景可能永远不可见,因为它会被应用在该视图上绘制的任何其它内容完全覆盖。例如,当系统在父View 上绘制子 View 时,可能会完全覆盖父 View 的背景。可以将 Window 背景设为应用的主背景颜色,并且不为其上面的任何容器定义背景值。
  • 使视图层次结构扁平化
    复杂的布局可能导致 View 的层级结构过深,从而可能导致重叠的页面过多,出现了过度绘制的情况,可以通过优化布局来减少重叠页面,从而提高性能。
  • 降低透明度
    在屏幕上渲染透明像素,即所谓的透明度渲染,使导致过度绘制的重要因素。在普遍的过度绘制中,系统会在已绘制的现有像素上绘制不透明的像素,从而将其完全遮盖,与此不同的是,透明对象需要先绘制现有的像素,以便达到正确的效果。诸如透明动画、淡出和阴影之类的视觉效果都会涉及到某种透明度,因此有可能会导致严重的过度绘制。可以通过减少要渲染的透明对象的数量,改善这些情况下的过度绘制。例如,要获得灰色文本,可在 TextView 中绘制黑色文本,再为其设置半透明的透明度值,如下:
        textView.setTextColor(Color.parseColor("#000000"));
        textView.setAlpha(0.6f);
        textView.setText("灰色文本");

但是,可以简单地通过用灰色绘制文本来获得同样的效果,而且能够大幅提升性能,如下:

       textView.setTextColor(Color.parseColor("#99000000"));
       textView.setText("灰色文本");

你可能感兴趣的:(Android 优化之减少过度绘制)