开发
开发
选择平台

使用 ovrgpuprofiler 分析 GPU

Ovrgpuprofiler 是一款为 Meta Quest 头戴设备设计的性能监控 CLI 工具,开发者可以使用它来访问各种实时 GPU 指标并执行渲染阶段追踪。其设计旨在以便捷、低阻力的方式访问实时的指标和 GPU 性能分析数据。Ovrgpuprofiler 包含在 Meta Quest 运行时中,无需手动安装。

使用 ovrgpuprofiler 获取实时指标

建议在使用 ovrgpuprofiler 时,通过 ADB 在连接的 Meta Quest 上打开一个 shell。如果不使用 shell,请在本主题中的所有命令前加上 adb shell <command>

获取指标列表

要列出所有支持的实时指标及其 ID 编号,请在 Meta Quest 通过 ADB 连接时在命令行中输入以下:
ovrgpuprofiler -m
此命令的输出开头如下所示:
    47 metrics supported:
    1       Clocks / Second
    2       GPU % Bus Busy
    3       % Vertex Fetch Stall
    4       % Texture Fetch Stall
    5       L1 Texture Cache Miss Per Pixel
    6       % Texture L1 Miss
    7       % Texture L2 Miss
    8       % Stalled on System Memory
    9       Pre-clipped Polygons/Second
    10      % Prims Trivially Rejected
    11      % Prims Clipped
您也可以使用 ovrgpuprofiler -m -v 提供同样的列表,不过该命令可以为每个指标提供更详细的说明。

获取指标数据

要检索某个指标的数据,可采用如下格式的命令:
`ovrgpuprofiler -r<metric ID number>`
例如,要检索指标纹理数据获取停滞时间(ID 编号为 4),输入 ovrgpuprofiler -r4,数据将在控制台每秒打印一次,直到您按下 Ctrl-C 为止。

获取多个指标的数据

您还可以通过在字符串中用逗号分隔 ID 编号的方式(比如输入 ovrgpuprofiler -r"4,5,6")来同时申请检索多个指标。以下显示了 ovrgpuprofiler -r"4,5,6" 的输出:
$ ovrgpuprofiler -r"4,5,6"
% Texture Fetch Stall                      :           2.449
L1 Texture Cache Miss Per Pixel            :           0.124
% Texture L1 Miss                          :          20.338

% Texture Fetch Stall                      :           2.369
L1 Texture Cache Miss Per Pixel            :           0.122
% Texture L1 Miss                          :          20.130

% Texture Fetch Stall                      :           2.580
L1 Texture Cache Miss Per Pixel            :           0.127
% Texture L1 Miss
注意:建议不要同时申请检索超过 30 个实时指标。

使用 ovrgpuprofiler 进行渲染阶段

ovrgpuprofiler 支持在每个图块级别进行渲染阶段 GPU 追踪。与按顺序执行绘制调用的直接模式 GPU 不同,基于图块的渲染器会为某个完整界面批量执行绘制调用,然后将该界面切分成图块,再按顺序对每个图块进行计算,其中每个图块会执行所有与之相交的绘制调用。ovrgpuprofiler 可以展示追踪期间每个已渲染界面在每个渲染阶段各花费了多少时间。

准备进行渲染阶段

在每个图块级别进行追踪需要将被追踪应用的 GPU 上下文配置为详细的 GPU 分析模式。要将操作系统设置为以详细的 GPU 分析模式启动后续应用,请输入以下命令:
ovrgpuprofiler -e
如果在输入命令时有应用仍在运行,则必须重启该应用,以便将其 GPU 上下文更改为详细的 GPU 分析模式。
ovrgpuprofiler -i 可显示是否启用了详细的 GPU 分析模式,而 ovrgpuprofiler -d 可禁用该模式。
此外,使用 ovrgpuprofiler 进行分析的应用必须在其清单中加入 <uses-permission android:name="android.permission.INTERNET" /> 权限。
注意:详细的 GPU 分析会导致 GPU 渲染时间增加约 10%。在读取追踪输出时请考虑这一开销。

执行追踪

要对当前运行的应用执行 100 毫秒的追踪,请输入以下命令:
ovrgpuprofiler -t
追踪长度可以通过 -t 参数加上一个数字来指定,以秒为单位。例如,ovrgpuprofiler -t1.2 将执行 1.2 秒的追踪。
追踪的输出会打印到控制台上,列出追踪期间渲染的界面及其渲染阶段的信息。

读取追踪

追踪输出的行如下所示:
    Surface 1    | 1216x1344 | color 32bit, depth 24bit, stencil 0 bit, MSAA 4 | 60  128x224 bins | 5.08 ms | 130 stages :  Binning : 0.623ms Render : 1.877ms StoreColor : 0.309ms Blit : 0.002ms Preempt : 1.286ms
这段输出表示界面 1 的分辨率为 1216x1344,采用 32 位色、32 位深度,并使用 MSAA4。该界面被分拆成 60 个大小为 128x224 的图块/分块,渲染总时长为 5.08 毫秒。过程中有 130 次渲染阶段执行,其余数据说明在每个渲染阶段花费的时间。请注意,并非每个渲染表面都会经历全部的渲染阶段。出现的渲染阶段包括以下各项:
在 Meta Quest 上,ovrgpuprofiler 将为多视图应用界面的每个切片输出一行数据。这意味着每只眼睛对应一个界面。您需要将两只眼睛对应界面的渲染时长累加,以得出帧渲染总时长。
然而,在 Meta Quest 2 上,由于 Adreno650 GPU 处理多视图命令的方式(硬件多视图),ovrgpuprofiler 将为界面的两个视图,输出一行数据。在 Quest 2 上,多视图界面的分块由两个视图共享,所以在追踪中
135 96x176 bins
应该解释为
135 96x176x2 bins
出现的渲染阶段包括以下各项:
  • 分块 - Meta Quest 的 GPU 使用图块架构,意味着帧的所有绘制调用都在两个阶段执行。第一个阶段是分块阶段,在该阶段所有绘制调用的三角形顶点位置都将进行计算并分配到与绘制界面分区对应的分块中。
  • 渲染 - 这是从分块开始的绘制调用的第二个阶段。此阶段的一个部分代表一个分块所有顶点和片段操作的总成本。顶点着色器的简化版会在分块期间执行,以确定三角形的位置。在这个阶段,顶点着色器的完整版会重新执行,以计算片段着色器所使用的插值。
  • 加载色彩 - 将颜色数据从慢速内存加载到快速内存。此阶段发生的场景可能是系统在不清除某个界面的情况下,开始将图像渲染到该界面。
  • 存储色彩 - 在执行完一完整分块的像素和片段操作后,系统将计算出的颜色值从快速内存(专用于该分块渲染操作的内存)复制到慢速内存。
  • 位块传输 - 在慢速内存区域之间复制。这可以在多种操作中发生,例如在生成多级渐远纹理时以及在不渲染任何内容的情况下清除界面时。
  • 抢占- 合成器是一个操作系统级别的服务,会定期执行,将应用提交的图像呈现到屏幕上。为了按正确的节奏呈现图像,GPU 会抢占应用的工作负载,以便合成器能及时完成工作。

命令行参数参考

以下推荐可用的 ovrgpuprofiler 命令行参数:
参数
描述
-r/--realtime
每秒打印一次实时指标的值。接受一个可选的指标 ID 列表,这些 ID 以逗号分隔,用于指定需要追踪的指标。
-m/--metrics
打印可用实时指标 ID 及其名称和说明的列表。
-v/--verbose
为大多数其他命令添加更加详细的信息。
-e/--enable-detailed
启用 GPU 驱动程序的详细分析模式;渲染阶段追踪时需要使用此参数。仅适用于在此模式启动后启动的应用。
-i/--is-detailed
查询 GPU 驱动程序是否处于详细分析模式。
-t/--trace
执行渲染阶段追踪,可选择加上以秒为单位的追踪时长参数。
-c/--continuous
如果您在使用 -t/--trace 的同时指定了此参数,渲染阶段追踪的结果将定期轮询以减少内存压力。
-l/--low-overhead
如果您在使用 -t/--trace 的同时指定了此参数,渲染阶段追踪将在低开销模式下运行,通过省略许多细节来获得更精确的测量结果。

另请参阅