开发

使用 ovrgpuprofiler 分析 GPU

ovrgpuprofiler 是一款为 Meta Quest 头戴设备设计的性能监控 CLI 工具,可供开发者用于访问一系列实时 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
注意:此示例输出中显示的指标计数 (47) 仅对应捕获输出时所使用的设备和运行时版本。实际支持的指标数量因设备和运行时版本而异。
或者,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
如果在输入命令时有应用仍在运行,则必须重启该应用才能使更改生效。
ovrgpuprofiler -i 显示当前是否已启用详细 GPU 分析模式。使用 ovrgpuprofiler -d 禁用该模式。
此外,使用 ovrgpuprofiler 进行分析的应用可能需要在其清单中加入 <uses-permission android:name="android.permission.INTERNET" /> 权限。
注意:详细 GPU 分析会导致 GPU 渲染时间增加约 10%。在读取追踪输出时请考虑这一开销。
注意:INTERNET 权限要求可能因运行时版本而异。验证您的特定设置和目标运行时是否需要此权限。

执行追踪

要对当前运行的应用执行 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 位色、24 位深度,并使用 MSAA 4。该界面被分拆成 60 个大小为 128x224 的图块/分块,渲染总时长为 5.08 毫秒。过程中有 130 次渲染阶段执行,其余字段显示在每个渲染阶段花费的时间。并非每个渲染表面都会经历全部的渲染阶段。

不同设备的多视图界面输出

在 Meta Quest 上,ovrgpuprofiler 会为多视图应用界面的每个切片输出一行数据。这意味着每只眼睛对应一个界面。您需要将两只眼睛对应界面的渲染时长累加,以得出帧渲染总时长。
然而,在 Meta Quest 2 上,由于 Adreno 650v3 GPU 处理多视图命令的方式(硬件多视图),ovrgpuprofiler 会为界面的两个视图,输出一行数据。在 Meta Quest 2 上,多视图界面的分块由两个视图共享。因此,以下输出:
135 96x176 bins
应解读为:
135 96x176x2 bins
Meta Quest 3 和 Meta Quest 3S 均采用 Adreno 740v3 GPU(Meta Quest 3 主频 690 MHz,Meta Quest 3S 主频 492 MHz)。对于这些设备,尚未验证 ovrgpuprofiler 是为每只眼睛输出一行数据(如在 Meta Quest 上),还是为两个视图输出一行数据(如在具有硬件多视图模式的 Meta Quest 2 上)。请参阅运行时版本的发布说明或联系开发者支持团队进行确认。
出现的渲染阶段包括以下各项:
  • 分块 - Meta Quest 的 GPU 使用图块架构,意味着帧的所有绘制调用都在两个阶段执行。第一个阶段是分块阶段,在该阶段所有绘制调用的三角形顶点位置都将进行计算并分配到与绘制界面分区对应的分块中。
  • 渲染 - 这是从分块开始的绘制调用的第二个阶段。此阶段的一个部分代表一个分块所有顶点和片段操作的总成本。顶点着色器的简化版会在分块期间执行,以确定三角形的位置。在这个阶段,顶点着色器的完整版会重新执行,以计算片段着色器所使用的插值。
  • 加载色彩 - 将颜色数据从慢速内存加载到快速内存。此阶段发生的场景可能是系统在不清除某个界面的情况下,开始将图像渲染到该界面。
  • 存储色彩 - 在执行完一完整分块的像素和片段操作后,系统将计算出的颜色值从快速内存(专用于该分块渲染操作的内存)复制到慢速内存。
  • 位块传输 - 在慢速内存区域之间复制。这可以在多种操作中发生,例如在生成多级渐远纹理时以及在不渲染任何内容的情况下清除界面时。
  • 抢占- 合成器是一个操作系统级别的服务,会定期执行,将应用提交的图像呈现到屏幕上。为了按正确的节奏呈现图像,GPU 会抢占应用的工作负载,以便合成器能及时完成工作。

使用 ovrgpuprofiler 获取单次绘制指标

除了按表面渲染阶段追踪外,ovrgpuprofiler 还可以在每个表面内按单次绘制调用采样 GPU 指标。这有助于识别哪些绘制调用占用了一帧的 GPU 开销,或比较单个绘制调用的相对开销。
单次绘制指标使用与实时指标不同的指标目录 — 可用的 ID 及其描述均不相同。

准备单次绘制追踪

单次绘制追踪要求应用的 GPU 上下文处于详细 GPU 分析模式。按照与渲染阶段追踪相同的设置步骤,输入 ovrgpuprofiler -e 并重新启动目标应用。

列出单次绘制指标

如要列出连接设备支持的单次绘制指标,请输入:
ovrgpuprofiler -x -m
输出会列出每个指标编号及其名称。添加 -v 以获取更详细的描述。与实时指标一样,可用的指标集因设备和运行时版本而异。

捕捉单次绘制追踪数据

如要捕捉单次绘制追踪数据,将 -x(绘制调用)标记与 -t(追踪)标记结合使用,并传入以逗号分隔的单次绘制指标编号列表用于记录:
ovrgpuprofiler -t3 -x="1,2,3,4,12,15,16,17,18,22,27,28,29,38,49,50"
在本示例中,-t3 运行 3 秒的追踪(默认追踪时长为 0.1 秒),-x 参数选择 16 个单次绘制指标编号进行采样。
注意:单次追踪过程中可请求的指标数量受 GPU 硬件的限制。请求的指标数量超出设备单次支持上限会导致输出中缺少某些指标值。如果您需要的指标数量超过单次可容纳数量,请使用不同指标子集运行多次追踪。

读取单次绘制追踪数据

输出结果按进程和命令缓冲区分组。对于每个绘制指令,追踪会打印一行包含帧号、绘制编号和可选绘制标签的标题行,后面是 LRZ(低分辨率 Z)状态以及每个请求指标的值:
Tracing for 3.0 seconds...
Process com.YourApp has 30 commandbuffers
    Frame 1   : Draw 1   Label 0xffffffff
        LRZ State: TestEnabled, WriteEnabled <0x03>
        Clocks                                     :       58912.000
        % Vertex Fetch Stall                       :           0.061
        % Shaders Busy                             :          39.907
        Fragments Shaded                           :           3.203
    Frame 1   : Draw 2   Label 0xffffffff
        LRZ State: TestEnabled, WriteEnabled <0x03>
        Clocks                                     :       44008.000
        % Vertex Fetch Stall                       :           0.000
        ...
注意:单次绘制计时最适合用于同一追踪内不同绘制之间的相对比较。单次绘制测量会引入管线停顿,从而影响绝对计时值。
完成单次绘制追踪捕捉后,使用 ovrgpuprofiler -d 禁用详细分析模式。

命令行参数参考

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

另请参阅