
AMD
pow(a, b)这个函数,如果由于着色器运算问题导致传入的A值为负数,那么GPU的计算结果可能是不可预测的。这时,是应该让结果返回NaN(非数值),还是返回0?如果是NaN,那么与NaN进行的所有运算都会输出NaN,屏幕可能会变黑,视觉效果就会出错;如果是0,计算结果看起来似乎没有问题。在渲染领域,绝大多数情况下我们追求的是看起来没问题。为了实现这一点,并同时获得最佳性能,每一款发布的游戏都经过了无数的优化,甚至是一些看似取巧的优化手段。这些优化的目的在于尽可能降低发热、稳定帧率,并节省性能空间以开启更高质量的效果。然而,这种做法不可避免地会引入一些潜在的bug。同样的道理,类似除以0、与模为0的向量进行叉积、在俯视角为0的情况下进行投影矩阵运算、用0进行正切(tan)运算、或者一个特别大的数与一个特别小的数进行浮点数运算但精度不足等情况,从数学角度看,这些问题的结果是没有意义的。当然,为了避免这些问题,我们可以对每次输入和输出进行约束或检查。然而,这些操作都需要消耗额外的性能,最终可能导致设备发热、卡顿或掉帧等用户不愿看到的情况。因此,这类问题通常被归类为游戏bug。但如果游戏规模过大,或者游戏开发者因技术原因无法及时更新修复,手机厂商会在驱动层尝试应用某些方法来解决这些问题。例如,现在大多数手机在pow(a, b)中遇到a为负值时,直接将输出值设为0,只有某些老款型号才会返回NaN。在这种情况下,我们就不需要再为变量a额外添加ABS或clamp等运算来限制其范围了。虽然单次优化看似微不足道,但如果这种运算是针对覆盖屏幕面积较大的半透明面片逐像素执行的,每秒可能要发生上百万甚至上千万次,那么节省下来的性能是非常可观的。正是因为华为的一切都是自主研发,所以在这一领域的经验和坑积累得较少,踩过的坑也相对较少,因此需要逐步积累经验并进行适配。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号