分析纹理内存带宽用量

纹理数据的内存带宽可能会成为应用 GPU 性能的潜在瓶颈。AGI 系统配置文件中有一些计数器可以帮助您诊断纹理内存带宽问题。

Qualcomm Adreno 计数器

在配备 Qualcomm Adreno GPU 的设备上,一些值得注意的计数器包括:

还价 说明
纹理内存读取带宽(字节/秒) 从外部内存读取的纹理数据的带宽。
未处理纹理 L1 的百分比 提取纹理导致的 L1 缓存未命中。
非基本级纹理所占的百分比 属于 mipmap 的纹理提取所占的百分比。
各向异性过滤百分比 滤除各向异性纹素的百分比。

ARM Mali 计数器

在采用 ARM Mali GPU 的设备上,一些值得注意的计数器包括:

还价 说明
来自外部内存的纹理读取次数 数据节拍了从外部内存读取的数据(按纹理单元),在着色器核心上取平均值。
L2 缓存中的纹理读取节奏 从 L2 缓存中读取的数据节拍通过纹理单元,在着色器核心上取平均值。
[更多]

要根据平均读取节拍数计算总带宽,请将计数器值乘以总线宽度(通常为 16 个字节)与着色器核心总数。

计数器分析

如需测量这些计数器的行为,请测量单个 GPU 帧的平均带宽和峰值带宽,然后使用连续的 GPU 利用率块划分特征。

单个帧的纹理内存读取带宽,平均值为 565 MBps,峰值为 2.30 GBps
图 1. 单个帧的纹理内存读取带宽,平均值为 565 MBps,峰值为 2.30 GBps

建议平均纹理内存读取带宽不超过 1 GBps,峰值带宽不高于 3 GBps。纹理 L1 缓存未命中也不应高于 10%。带宽或 L1 缓存的值较高可能表示存在更深层的纹理问题,包括:

  • 纹理过大:较大的纹理会使您的软件包变得膨胀,而且费用也会更高,并且可能会降低缓存效率。
  • 纹理未经压缩:所有 Android 手机都支持某些类型的纹理压缩,包括 ETC1 或 ASTC。应对纹理进行压缩,以缩减软件包大小并减少纹理带宽。
  • 其他:还应考虑各种其他纹理问题,包括 2 次方纹理、mipmap 和各向异性过滤等。其中一些可能通过系统配置文件观察到(如下文所述),而其他一些可能需要更深入的调查。

对于配有免费相机的三维游戏,纹理资源应使用 mipmapping,这样与相机距离较远的对象将具有更低的内存带宽、更好的纹理缓存效率和更出色的图片质量。对于使用 Qualcomm Adreno GPU 的设备,非基础纹理计数器平均低于 10% 可能表明 mipmap 不足。

单个帧的非基础级纹理,平均值为 9.2%
图 2. 单帧的非基础级纹理,平均值为 9.2%

另一个需要考虑的因素是使用各向异性过滤;对于 Qualcomm Adreno GPU 的 % 各向异性过滤计数器,可针对各向异性过滤的纹素比例进行描述。虽然这种方法可以改善某些游戏的视觉质量,但成本也很高,因此应该权衡 GPU 性能开销。

针对单个帧过滤的各向异性的平均值为 10.8%
图 3. 针对单个帧过滤的各向异性百分比,平均值为 10.8%

如需诊断更具体的问题,最佳方法是通过帧配置文件轨迹来分析纹理资源。