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