找出开销最高的渲染通道

AGI 帧分析器可让您检查用于构成应用单帧的各个渲染通道。它通过拦截和记录执行每个图形 API 调用所需的所有状态来实现此目的。在 Vulkan 上,这是使用 Vulkan 的分层系统原生完成的。在 OpenGL 上,命令使用 ANGLE 拦截,ANGLE 将 OpenGL 命令转换为 Vulkan 调用,以便它们可以在硬件上执行。

Adreno 设备

要找出开销最高的渲染通道,首先查看窗口顶部的 AGI 时间轴视图。此视图按时间顺序显示构成给定帧的所有渲染通道。如果您有 GPU 队列信息,您将在系统分析器中看到相同的视图。它还提供了有关渲染通道的基本信息,例如正在渲染的帧缓冲区的分辨率,这可以提供一些关于渲染通道本身正在发生什么的信息。

Frame Timeline view
图 1. 帧时间轴视图

您可以用来调查渲染通道的第一个标准是它们所花费的时间。最长的渲染通道很可能是具有最大改进潜力的渲染通道,所以从它开始着手。

Identifying the longest render pass in the Frame Timeline view
图 2. 在帧时间轴视图中识别最长的渲染通道

与相关渲染通道相关的 GPU 切片将已经显示有关渲染通道内部正在发生的一些信息

  1. 分桶:根据顶点在屏幕上的位置将其放入桶中
  2. 渲染:像素或片段着色的位置
  3. GMEM 加载/存储:当帧缓冲区的内容从内部 GPU 内存加载或存储到主内存时

通过查看这些操作在渲染通道中各自花费的时间,您可以很好地了解潜在的瓶颈在哪里。例如:

  • 如果分桶占用大量时间,这表明顶点数据存在瓶颈,可能意味着顶点过多、顶点过大或其他与顶点相关的问题。
  • 如果渲染占用大部分时间,这表明着色是瓶颈。可能的原因包括复杂的着色器、过多的纹理获取、在不需要时渲染到高分辨率帧缓冲区,或与此相关的其他问题。

GMEM 加载和存储也是需要记住的。将数据从图形内存移动到主内存开销很大,因此最大限度地减少加载或存储操作的数量也将有助于提高性能。一个常见的例子是进行 GMEM 深度/模板存储,它将深度/模板缓冲区写入主内存;如果您在未来的渲染通道中不使用该缓冲区,则可以消除此存储操作,从而节省帧时间和内存带宽。

Identifying GMEM loads and stores
图 3. 识别 GMEM 加载和存储

大型渲染通道调查

要查看渲染通道期间发出的所有单独绘制命令

  1. 在时间轴中点击渲染通道。这将在“帧分析器”的“命令”窗格中打开渲染通道的层次结构。

  2. 点击渲染通道的菜单,它会显示渲染通道期间发出的所有单独绘制命令。如果这是 OpenGL 应用程序,您可以进一步深入,查看 ANGLE 发出的 Vulkan 命令。

Commands pane
图 4. 命令窗格

选择其中一个绘制调用。这将打开“帧缓冲区”窗格,其中显示此绘制期间绑定的所有帧缓冲区附件,以及绘制在附加帧缓冲区上的最终结果。在这里,您还可以使用 AGI 打开上一个和下一个绘制调用,并比较两者之间的差异。如果它们在视觉上几乎相同,这表明有机会消除不影响最终图像的绘制调用。

Selecting individual draw calls in the Commands pane
图 5. 在命令窗格中选择单个绘制调用

打开此绘制的“流水线”窗格会显示图形流水线用于执行此绘制调用的状态。

Pipeline pane
图 6. 流水线窗格

输入汇编器提供有关顶点数据如何绑定到此绘制的信息。如果您注意到分桶占用了渲染通道的大部分时间,这是一个很好的调查区域;在这里您可以获取有关顶点格式、绘制的顶点数量以及顶点在内存中布局方式的信息。有关此内容的更多信息,请参阅分析顶点格式

Input Assembler section in the Pipeline pane
图 7. 流水线窗格中的输入汇编器部分

顶点着色器部分提供了有关您在此绘制期间使用的顶点着色器的信息,如果分桶被确定为问题,这也是一个很好的调查地点。您可以查看所用着色器的 SPIR-V 和反编译的 GLSL,并调查此调用绑定的统一缓冲区。有关更多详细信息,请参阅分析着色器性能

Vertex Shader section in the Pipeline pane
图 8. 流水线窗格中的顶点着色器部分

光栅化器部分向您显示有关流水线中更多固定功能设置的信息,更多用于调试固定功能状态,例如视口、裁剪、深度状态和多边形模式。

Rasterizer section in the Pipeline pane
图 9. 流水线窗格中的光栅化器部分

片段着色器部分提供了与顶点着色器部分中相同的大量信息,但专门针对片段着色器。在这种情况下,您可以实际查看正在绑定的纹理并通过点击句柄进行调查。

Fragment Shader section in Pipeline pane
图 10. 流水线窗格中的片段着色器部分

较小渲染通道调查

另一个可以用来改善 GPU 性能的标准是查看较小的渲染通道组。通常,您希望尽可能减少渲染通道的数量,因为 GPU 更新从一个渲染通道到另一个渲染通道的状态需要时间。这些较小的渲染通道通常用于生成阴影贴图、应用高斯模糊、估算亮度、执行后期处理效果或渲染 UI。其中一些可以合并到一个渲染通道中,甚至完全消除,如果它们对整体图像的影响不足以证明其成本合理的话。

Smaller render passes used to downsample the native resolution buffer
图 11. 用于对原生分辨率缓冲区进行降采样的较小渲染通道