识别您最昂贵的渲染通道

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. 用于对原生分辨率缓冲区进行下采样的较小渲染流程