应用的内存使用特征是应用性能的一个基本方面。您可以使用系统性能分析器查看可用的 GPU 计数器信息,从而分析这些特性。
Adreno 设备
在 Adreno 设备上,首先突出显示与单个 GPU 帧一致的时间段,如估算 CPU 和 GPU 帧处理时间中所述。 请使用该页面上介绍的技术,其中涉及对帧时间范围使用 GPU % Utilization 或类似计数器跟踪。因为计数器跟踪都使用相同的计时方法,可以更准确地估算内存利用率(与使用从 GPU 切片派生的帧时间范围相比,该 Slice 的数据独立于计数器跟踪数据而收集)。
![利用率轨道与下方的相关计数器对齐](https://developer.android.google.cn/static/images/agi/memory_efficiency-images/image1.png?authuser=5&hl=nb)
读/写总计
在性能分析器中突出显示单个帧后,首先查看 Read Total (Bytes/sec) 和 Write Total (Bytes/sec) 计数器。通过这些计数器,您可以很好地总体了解单个帧过程中有多少数据穿越了内存总线。内存带宽是移动设备上耗电量的主要来源,因此请尽可能减少通过总线发送的数据量。
![读写总计数器](https://developer.android.google.cn/static/images/agi/memory_efficiency-images/image2.png?authuser=5&hl=nb)
您还可以检查顶点内存读取(字节/秒)和纹理内存读取(字节/秒)计数器,确定用于顶点和纹理数据的带宽部分。
![顶点 + 纹理内存读取计数器](https://developer.android.google.cn/static/images/agi/memory_efficiency-images/image3.png?authuser=5&hl=nb)
您对这些值的“良好”标准取决于应用中看到的工作负载类型。例如,2D 应用可能会使用相对较大(约 2+GB/秒)的纹理内存读取带宽,但顶点内存带宽可能非常低(约 50MB/秒)。如需了解详情,请查看分析顶点内存带宽和分析纹理内存带宽用量文档。
提取停顿
查看 % Vertex Fetch Stall、% Texture Fetch Stall 和 % Stall on System Memory 计数器,因为它们将为您提供一些关于应用整体内存性能的提示。如果这些值高于大约 5%,则表示您的应用未在内存中高效地布置数据,或者正在以充分利用缓存的有效方式访问其数据。如需详细了解如何提高这些类型的资源的内存用量,请查看分析顶点内存带宽和分析纹理内存带宽用量。
![内存延迟计数器](https://developer.android.google.cn/static/images/agi/memory_efficiency-images/image4.png?authuser=5&hl=nb)
Mali 设备
在 Mali 设备上,首先突出显示与单个 GPU 帧一致的时间段,如估算 CPU 和 GPU 帧处理时间中所述。 请使用该页面上介绍的技术,其中涉及对帧时间范围使用 GPU % Utilization 或类似计数器跟踪。因为计数器跟踪都使用相同的计时方法,可以更准确地估算内存利用率(与使用从 GPU 切片派生的帧时间范围相比,该 Slice 的数据独立于计数器跟踪数据而收集)。
![利用率轨道与您想使用的计数器一起排列在下方](https://developer.android.google.cn/static/images/agi/memory_efficiency-images/image5.png?authuser=5&hl=nb)
输出外部总计
在系统性能分析器中突出显示单个帧后,请先查看 Output External Read bytes Output External Write bytes 计数器。通过这些计数器,您可以很好地总体了解单个帧过程中有多少数据穿越了内存总线。尽可能减少通过总线发送的数据量,因为内存带宽是移动设备上耗电量的主要来源。
![输出外部计数器轨迹](https://developer.android.google.cn/static/images/agi/memory_efficiency-images/image6.png?authuser=5&hl=nb)
输入内部总计值
还有一些计数器可以为您提供有关缓存本身的信息。您感兴趣的计数器是“Input internal [read|write] stall cycles”(输入内部 [读取|写入] 停滞周期)。这些数值越高,表示您成功访问了缓存,但发出的读取请求过多,因此着色器代码停滞,以等待访问内存。
![输入内部计数器跟踪](https://developer.android.google.cn/static/images/agi/memory_efficiency-images/image7.png?authuser=5&hl=nb)
提取停顿
您可以查看的下一组计数器是 Vertex Prefetcher Stall Cycles 和 Texture Fetch Stall 计数器,因为您可以通过它们了解应用的整体内存性能。如果您看到高于 5% 左右的值,这表示您要么没有高效地在内存中布局数据,要么没有以有效方式访问我们的数据以利用缓存。请查看“分析 [Vertex|Texture] 内存带宽”文章,详细了解如何提高这些类型资源的内存使用率
![提取摊位计数器轨道](https://developer.android.google.cn/static/images/agi/memory_efficiency-images/image8.png?authuser=5&hl=nb)