分析内存效率

应用的内存使用特性是其性能的一个基本方面。您可以使用 System Profiler 通过查看可用的 GPU 计数器信息来分析这些特性。

Adreno 设备

在 Adreno 设备上,首先按照估算 CPU 和 GPU 帧处理时间中描述的方法,突出显示与单个 GPU 帧一致的一段时间。使用该页面中描述的技术,即使用GPU 利用率百分比或类似的计数器轨迹作为您的帧时间边界,因为所有计数器轨迹都使用相同的计时技术,并且可以更准确地估算内存利用率(与使用从 GPU 切片派生的帧时间边界相比,GPU 切片的数据独立于计数器轨迹数据收集)。

Utilization track lining up with the relevant counters below it
图 1. 利用率轨迹与其下方相关计数器对齐

读/写总量

在分析器中突出显示单个帧后,首先查看读取总量(字节/秒)写入总量(字节/秒)计数器。这些计数器提供了在一个帧内有多少数据跨内存总线传输的良好总体视图。尽力减少通过总线发送的数据量,因为内存带宽是移动设备上电池消耗的主要来源。

Read + Write Total Counters
图 2. 读取+写入总量计数器

您还可以检查顶点内存读取(字节/秒)纹理内存读取(字节/秒)计数器,以确定用于顶点和纹理数据的带宽部分。

Vertex + Texture Memory Read Counters
图 3. 顶点+纹理内存读取计数器

这些值被认为是“好”的程度取决于您的应用中看到的工作负载类型。例如,2D 应用程序可能会看到相对较大的(~2GB/秒以上)纹理内存读取带宽使用量,但顶点内存带宽可能非常小(~50MB/秒)。有关更多详细信息,请查看分析顶点内存带宽分析纹理内存带宽使用情况的文档。

获取停顿

查看顶点获取停顿百分比纹理获取停顿百分比系统内存停顿百分比计数器,因为这些将为您提供有关应用程序整体内存性能的一些提示。如果这些值高于大约 5%,则表明您的应用要么没有以有效的方式在内存中布局数据,要么没有以有效的方式访问其数据以利用缓存。有关如何改进这些类型资产的内存使用的详细信息,请参阅分析顶点内存带宽分析纹理内存带宽使用情况

Memory Stall Counters
图 4. 内存停顿计数器

Mali 设备

在 Mali 设备上,首先按照估算 CPU 和 GPU 帧处理时间中描述的方法,突出显示与单个 GPU 帧一致的一段时间。使用该页面中描述的技术,即使用GPU 利用率百分比或类似的计数器轨迹作为您的帧时间边界,因为所有计数器轨迹都使用相同的计时技术,并且可以更准确地估算内存利用率(与使用从 GPU 切片派生的帧时间边界相比,GPU 切片的数据独立于计数器轨迹数据收集)。

Utilization track lining up with the counters you are interested in below it
图 5. 利用率轨迹与其下方您感兴趣的计数器对齐

外部输出总量

在您在 System Profiler 中突出显示单个帧后,首先查看外部输出读取字节数外部输出写入字节数计数器。这些计数器提供了在一个帧内有多少数据跨内存总线传输的良好总体视图。尽力减少通过总线发送的数据量,因为内存带宽是移动设备上电池消耗的主要来源。

Output External counter tracks
图 6. 外部输出计数器轨迹

内部输入总量

还有一些计数器可以为您提供有关缓存本身的信息。您感兴趣的计数器是“内部输入 [读取|写入] 停顿周期”。这些值越高,意味着您成功命中缓存,但发出了太多读取请求,结果是着色器代码在等待获取内存访问权限时发生停顿。

Input Internal counter tracks
图 7. 内部输入计数器轨迹

获取停顿

接下来您可以查看的计数器是顶点预取器停顿周期纹理获取停顿计数器,因为这些将为您提供有关我们应用程序整体内存性能的一些提示。如果您看到的值高于约 5%,则意味着您要么没有以有效的方式在内存中布局数据,要么没有以有效的方式访问我们的数据以利用缓存。有关如何改进这些类型资产的内存使用的详细信息,请参阅“分析 [顶点|纹理] 内存带宽”文章。

Fetch Stalls counter tracks
图 8. 获取停顿计数器轨迹