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