估算 CPU 和 GPU 帧处理时间(帧时间)对于了解应用的性能和找到瓶颈至关重要。当您使用 AGI 分析应用时,系统性能分析器会提供跟踪数据,可用于估算帧时间。
CPU 时间
在 AGI 中,您可以在系统配置文件的 CPU 轨道中查看总 CPU 帧时间和活跃 CPU 帧时间。
总 CPU 时间
如需测量花费的总 CPU 时间,请选择时间范围(包括连续帧提交事件之间的时间)。帧提交事件为 eglSwapBuffers
(对于 OpenGL)和 vkQueuePresentKHR
(对于 Vulkan)。
![几个 eglSwapBuffer 事件的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image1.png?authuser=5&hl=nl)
eglSwapBuffer
事件。![vkQueuePresentKHR 事件的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image2.png?authuser=5&hl=nl)
vkQueuePresentKHR
事件。此测量值是对总 CPU 时间的估算,但不一定代表活跃的 CPU 时间。例如,在受 GPU 约束的应用中,CPU 可能会等待 GPU 完成其工作,然后再提交新帧。当 dequeueBuffer
、eglSwapBuffer
(对于 OpenGL)或 vkQueuePresent
(对于 Vulkan)事件占用大部分 CPU 时间时,通常就会发生这种情况。等待时间包含在总 CPU 时间中,但不包含活跃 CPU 时间。
![显示 dequeueBuffer 和 eglSwapBuffer 事件期间大量空闲的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image3.png?authuser=5&hl=nl)
dequeueBuffer
和 eglSwapBuffer
事件期间出现大量空闲。活跃 CPU 时间
活跃 CPU 时间决定了 CPU 何时在未处于空闲状态的情况下运行应用代码。
如需测量活动 CPU 时间,请查看 CPU 事件正上方的 Running 切片。计算处于 Running 状态的两个帧提交事件之间的轨迹所有部分。请确保包含工作线程。
![可用于测量活动 CPU 时间的两个 CPU 时间段的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image5.png?authuser=5&hl=nl)
![屏幕截图:一个多线程应用,其中在主线程处于空闲状态时有一个工作线程。](https://developer.android.google.cn/static/images/agi/long-images/image6.png?authuser=5&hl=nl)
测量活跃 CPU 时间的另一种方法是查看 CPU 轨道中的应用切片。这些切片在 CPU 运行时指示,它们与正在运行切片相对应。
![显示与 CPU 轨道匹配的固定线程的运行状态的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image7.png?authuser=5&hl=nl)
为帮助识别应用切片,您可以向应用添加 ATrace 标记。这样一来,系统就会在系统性能分析器的 CPU 轨迹中显示这些标记。
![CPU 轨道中 ATrace 标记的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image8.png?authuser=5&hl=nl)
估算 GPU 帧时间
如需估算 GPU 帧时间,您可以使用系统性能分析器中的 GPU 切片或 GPU 计数器。使用 GPU 切片时,估算值会更准确。
GPU 切片
如果系统性能分析器有 GPU 切片信息可用,您可以通过测量应用花在与单个帧相关的任务上所花的总时间来获得非常准确的 GPU 帧时间信息。
Mali 设备
在 Mali 设备上,GPU 切片具有片段轨道、非片段轨道,并且偶尔具有补充性非片段轨道。对于不太复杂的帧,fragment 和非 fragment 工作是依序进行的,因此可以通过寻找活跃 GPU 工作之间的间隔时间来区分一个帧的工作与另一个帧的工作。
另一种方法是,如果您熟悉提交到 GPU 的工作,则可以通过确定已提交渲染通道的模式来提供有关帧何时开始和结束的信息。
![按顺序执行多个帧的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image9.png?authuser=5&hl=nl)
![AGI 放大单个帧效果的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image10.png?authuser=5&hl=nl)
对于 GPU 工作流高度并行的应用,您可以通过在每个切片的 Selection 窗格中查找具有相同 submissionID 的所有帧,获取 GPU 帧时间。
对于基于 Vulkan 的应用,多次提交可用于构成帧。可以使用 Vulkan 事件轨道跟踪提交内容 ID,该轨道包含每次提交对应的 Slice。选择提交切片将突出显示与提交内容对应的所有 GPU 活动切片。
![并行处理 GPU 工作负载的屏幕截图,其中一帧上的工作可以与另一帧上的工作重叠。](https://developer.android.google.cn/static/images/agi/long-images/image11.png?authuser=5&hl=nl)
![选定帧的几个 Vulkan 事件的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image12.png?authuser=5&hl=nl)
Adreno 设备
在 Adreno 设备上,GPU 切片会显示在 GPU 队列 0 轨道中,并且始终按顺序进行表示,因此您可以查看表示帧渲染通道的所有切片,并使用它们来衡量 GPU 帧时间。
![按顺序执行多个帧的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image13.png?authuser=5&hl=nl)
![AGI 放大具有多个渲染通道的帧的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image14.png?authuser=5&hl=nl)
与上述 Mali 场景类似:如果应用使用的是 Vulkan,Vulkan 事件轨道会提供有关为执行帧而提交的工作的信息。如需突出显示渲染通道,请点击与帧关联的 Vulkan 事件切片。
![基于 Vulkan 的应用的屏幕截图,其中包含选定帧的 Vulkan 事件。](https://developer.android.google.cn/static/images/agi/long-images/image15.png?authuser=5&hl=nl)
在某些情况下,由于应用严重受 GPU 限制,因此 GPU 帧边界较难区分。在这些情况下,如果您熟悉提交到 GPU 的工作,就可以确定执行渲染通道的模式,并根据该信息确定帧边界。
![严重受 GPU 限制的应用的屏幕截图,该应用采用渲染通道模式,有助于识别帧边界。](https://developer.android.google.cn/static/images/agi/long-images/image16.png?authuser=5&hl=nl)
GPU 计数器
如果跟踪记录中缺少 GPU 切片信息,您可以使用 GPU 计数器轨道来估算 GPU 帧时间。
Mali 设备
在 Mali 设备上,您可以使用 GPU 利用率轨道来估算非 GPU 密集型应用的 GPU 帧时间。当应用的 GPU 密集型程度较低时,它们会定期出现高和低的 GPU 活动,而不是持续的高活动。如需使用 GPU 利用率轨道估算 GPU 帧时间,请测量轨道中高活动期的时长。
![Mali 设备上 GPU 利用率和 GPU 队列轨道的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image17.png?authuser=5&hl=nl)
如果应用需要的 GPU 较多,您可以使用 fragment 和 non-fragment 轨道来估算 GPU 帧时间。通过在 Fragment 轨道和非 Fragment 轨道的活动级别中查找模式,您可以粗略估计帧边界的位置,并据此测量 GPU 帧时间。
![fragment 轨道和非 fragment 轨道的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image18.png?authuser=5&hl=nl)
Adreno 设备
在 Adreno 设备上,如果应用不是 GPU 密集型应用,您可以估算 GPU 帧时间,方法与上一部分中马里设备相同。
![Adreno 设备上 GPU 利用率和 GPU 队列跟踪的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image19.png?authuser=5&hl=nl)
如果应用的 GPU 占用率更高,您可以使用 Vertex Instructions / Second 和 Fragment Instructions / Second 轨道来估算 GPU 帧时间。通过查找这些轨道的活动级别中的模式,您可以粗略估计帧边界的位置,并据此测量 GPU 帧时间。
![Vertex Directionss / Second Track 的屏幕截图。](https://developer.android.google.cn/static/images/agi/long-images/image20.png?authuser=5&hl=nl)
这些其他轨道可能会提供类似信息:
- 顶点阴影 / 秒
- fragment 阴影 / 秒
- 阴影顶点百分比
- 时间片段所占百分比