本页面介绍过度绘制是什么、如何诊断以及消除或缓解过度绘制的方法。
如果应用在单个帧内多次绘制同一个像素,这称为*过度绘制*。过度绘制通常是不必要的,最好将其消除。当过度绘制浪费 GPU 时间来渲染对用户在屏幕上看到的内容没有贡献的像素时,就会成为性能问题。
关于过度绘制
过度绘制是指系统在单帧渲染中多次在屏幕上绘制某个像素。例如,如果您有一堆堆叠的 UI 卡片,每张卡片都会隐藏其下方卡片的一部分。
但是,系统仍然需要绘制堆叠中卡片的隐藏部分。这是因为堆叠卡片是根据画家算法渲染的,即从后到前的顺序。这种渲染序列允许系统对半透明对象(如阴影)应用正确的 Alpha 混合。
查找过度绘制问题
平台提供以下工具来帮助您确定过度绘制是否影响您的应用性能。
调试 GPU 过度绘制工具
“调试 GPU 过度绘制”工具使用颜色编码来显示您的应用在屏幕上绘制每个像素的次数。此计数越高,过度绘制影响您的应用性能的可能性就越大。
有关更多信息,请参阅可视化 GPU 过度绘制。
GPU 渲染分析工具
“GPU 渲染分析”工具将渲染管道的每个阶段显示单帧所需的时间显示为滚动直方图。每个条形的橙色“进程”部分显示系统何时正在交换缓冲区。此指标提供了有关过度绘制的重要线索。
在性能较低的 GPU 上,可用的填充率(GPU 填充帧缓冲区的速度)可能较低。随着绘制帧所需的像素数量增加,GPU 处理新命令可能需要更长时间,并要求系统的其余部分等待,直到它可以赶上。当 GPU 试图尽可能快地绘制像素时不堪重负,“进程”条形显示这种峰值发生。除原始像素数量外,其他问题也可能导致此指标出现峰值。例如,如果“调试 GPU 过度绘制”工具显示严重的过度绘制且“进程”出现峰值,则很可能存在过度绘制问题。
有关更多信息,请参阅分析 GPU 渲染速度。
修复过度绘制
您可以执行以下操作来减少或消除过度绘制:
- 移除布局中不必要的背景。
- 展平视图层次结构。
- 减少透明度。
本节提供有关这些方法的更多信息。
移除布局中不必要的背景
默认情况下,布局没有背景,这意味着它本身不会直接渲染任何内容。但是,当布局确实有背景时,它们可能会导致过度绘制。
通过移除不必要的背景,您可以提高渲染性能。不必要的背景可能不可见,因为它被应用在其上方绘制的所有内容完全覆盖。例如,当系统在其上方绘制子视图时,它可能会完全覆盖父级的背景。
要找出过度绘制的原因,请查看 布局检查器工具中的层次结构。您可以查找用户不可见的背景并将其消除。在许多共享相同背景颜色的容器中,可以消除不必要的背景。您可以将窗口背景设置为应用的主背景颜色,并将所有其上方的容器保留为未定义背景值。
展平视图层次结构
现代布局可帮助您堆叠和分层视图,以产生精美的设计。但是,这样做可能会导致过度绘制,从而降低性能,尤其是在每个堆叠的视图对象都是不透明的情况下,需要绘制屏幕上可见和不可见的像素。
如果您遇到此问题,可以通过优化视图层次结构以减少重叠 UI 对象的数量来提高性能。有关如何实现此目的的更多信息,请参阅性能和视图层次结构。
减少透明度
在屏幕上渲染透明像素(称为*Alpha 渲染*)是导致过度绘制的关键因素。与标准过度绘制不同(当系统通过在其上方绘制不透明像素来完全隐藏现有绘制像素时),透明对象需要首先绘制现有像素,以便发生正确的混合方程。
透明动画、淡出和阴影等视觉效果涉及一些透明度,因此可能显着导致过度绘制。在这种情况下,您可以通过减少渲染的透明对象数量来改善过度绘制。例如,您可以通过在TextView
中绘制黑色文本并为其设置半透明 Alpha 值来获得灰色文本。但是,通过绘制灰色文本,您可以以更好的性能获得相同的效果。
要了解透明度在整个绘制管道中造成的性能成本,请观看视频透明度的隐性成本。