分析纹理内存带宽用量

纹理数据的内存带宽可能会成为应用 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、各向异性过滤等。其中一些问题可以从系统配置文件中观察到(如下所述),而其他问题可能需要进行更深入的调查。

对于具有自由摄像头的 3D 游戏,纹理素材资源应使用 mipmap,这样,与摄像头有一定距离的对象将具有更低的内存带宽、更好的纹理缓存效率和更好的图像质量。对于使用 Qualcomm Adreno GPU 的设备,非基本级别纹理 计数器的平均值低于 10% 可能表明 mipmap 不足。

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

另一个需要考虑的因素是使用各向异性过滤,Qualcomm Adreno GPU 的 各向异性过滤百分比 计数器描述了经过各向异性过滤的纹素所占的比例。虽然这可能会提高某些游戏的视觉质量,但成本也可能非常高,因此应权衡其使用与 GPU 性能成本。

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

诊断更具体问题的最佳方法是获取帧配置文件轨迹以分析纹理素材资源。