分析纹理内存带宽使用情况

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

Qualcomm Adreno 计数器

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

计数器 说明
纹理内存读取带宽(字节/秒) 从外部内存读取的纹理数据的带宽。
纹理 L1 未命中率 从获取纹理导致的 L1 缓存未命中。
非基础级别纹理百分比 Mipmap 纹理获取的百分比。
各向异性过滤百分比 经过各向异性过滤的纹素百分比。

ARM Mali 计数器

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

计数器 说明
从外部内存读取的纹理节拍数 纹理单元从外部内存读取的数据节拍数,在着色器核心上取平均值。
从 L2 缓存读取的纹理节拍数 纹理单元从 L2 缓存读取的数据节拍数,在着色器核心上取平均值。
[更多]

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

计数器分析

要衡量这些计数器的行为,请测量单个 GPU 帧期间的平均带宽和峰值带宽,然后用连续的 GPU 利用率块进行划分。

Texture memory read bandwidth for a single frame, with average value of 565 MBps and peak value of 2.30 GBps
图 1. 单个帧的纹理内存读取带宽,平均值为 565 MBps,峰值为 2.30 GBps

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

  • 纹理过大:大纹理会使您的软件包大小膨胀,成本更高,并可能降低缓存效率。
  • 纹理未压缩:所有 Android 手机都支持某些类型的纹理压缩,无论是 ETC1 还是 ASTC。应压缩纹理以减小软件包大小并降低纹理带宽。
  • 其他:应考虑各种其他纹理问题,包括 2 的幂次纹理、mipmapping、各向异性过滤等。其中一些可以从系统配置文件中观察到,如下文所述,而其他一些可能需要更深入的调查。

对于带自由摄像机的三维游戏,纹理素材资源应使用纹理贴图,以便距离摄像机较远的对象具有更低的内存带宽、更好的纹理缓存效率和更好的图像质量。对于使用 Qualcomm Adreno GPU 的设备,平均非基础级别纹理计数器低于 10% 可能表明纹理贴图不足。

Non-base level textures for a single frame, with an average value of 9.2%
图 2. 单个帧的非基础级别纹理,平均值为 9.2%

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

Perecentage of anisotropic filtered for a single frame, with average value of 10.8%
图 3. 单个帧的各向异性过滤百分比,平均值为 10.8%

诊断更具体问题的最佳方法是进行帧配置文件跟踪以分析纹理素材资源。