纹理数据的内存带宽可能会成为应用 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](https://developer.android.google.cn/static/images/agi/texture-memory-images/sample_tex_bw.png?authuser=5&hl=ro)
建议平均纹理内存读取带宽不超过 1 GBps,峰值带宽不高于 3 GBps。纹理 L1 缓存未命中也不应高于 10%。带宽或 L1 缓存的值较高可能表示存在更深层的纹理问题,包括:
- 纹理过大:较大的纹理会使您的软件包变得膨胀,而且费用也会更高,并且可能会降低缓存效率。
- 纹理未经压缩:所有 Android 手机都支持某些类型的纹理压缩,包括 ETC1 或 ASTC。应对纹理进行压缩,以缩减软件包大小并减少纹理带宽。
- 其他:还应考虑各种其他纹理问题,包括 2 次方纹理、mipmap 和各向异性过滤等。其中一些可能通过系统配置文件观察到(如下文所述),而其他一些可能需要更深入的调查。
对于配有免费相机的三维游戏,纹理资源应使用 mipmapping,这样与相机距离较远的对象将具有更低的内存带宽、更好的纹理缓存效率和更出色的图片质量。对于使用 Qualcomm Adreno GPU 的设备,非基础纹理计数器平均低于 10% 可能表明 mipmap 不足。
![单个帧的非基础级纹理,平均值为 9.2%](https://developer.android.google.cn/static/images/agi/texture-memory-images/sample_nonbase.png?authuser=5&hl=ro)
另一个需要考虑的因素是使用各向异性过滤;对于 Qualcomm Adreno GPU 的 % 各向异性过滤计数器,可针对各向异性过滤的纹素比例进行描述。虽然这种方法可以改善某些游戏的视觉质量,但成本也很高,因此应该权衡 GPU 性能开销。
![针对单个帧过滤的各向异性的平均值为 10.8%](https://developer.android.google.cn/static/images/agi/texture-memory-images/sample_anisotropic.png?authuser=5&hl=ro)
如需诊断更具体的问题,最佳方法是通过帧配置文件轨迹来分析纹理资源。