https://www.bilibili.com/video/BV1tu41127LD?spm_id_from=333.788.videopod.sections&vd_source=22db36befcbe98b5c4cdb3d1d5f45f5d

性能优化问题的本质

  • 慢与快的问题

  • 前提

    • 稳定性:不能因优化造成稳定性变差;

    • 兼容性:不能因优化导致兼容性变差;

    • 性价比:优化要有度,考虑成本与复杂度。

性能优化的流程

  • 发现问题(什么平台、什么操作系统、什么情况下出现问题,一般问题还是特例问题等)

  • 定位问题(什么地方造成的性能问题,我们要用什么工具、什么方法确定瓶颈)

  • 研究问题(确定用什么方案处理这个问题,要考虑性能优化的前提)

  • 解决问题(按问题研究的结论去实际处理,并验证处理结果与预期的一致性)

影响性能的四大类问题

  • CPU

  • GPU

  • 带宽

  • 内存

1-dhlu.webp

隐藏的几类小问题

  • 功耗比

  • 填充率(实际渲染中,纹理或资源很大,带宽一次传不过去,两次又浪费的情况,这时你需要修改你的资源大小来匹配带宽,避免填充率不足或带宽阻塞问题)

  • 发热量

性能问题可能得情况

经验总结

  • 瓶颈可能性按由高到低的顺序排列

    • CPU 利用率

    • 带宽利用率

    • CPU/GPU强制同步

    • 片元着色器指令

    • 几何图形到 CPU 到 GPU 的传输

    • 纹理 CPU 到 GPU 的传输

    • 顶点着色器指令

    • 几何图形复杂性

GPU 端的瓶颈往往是片元着色器的问题,这点瓶颈很好确认,只需要改变显示分辨率,即可快速确认是不是由于片元着色器带来的问题。

经常用的优化思路

  • 升维与降维

升维用来优化性能,但从算法方面来说可能不太容易理解。

降维是为了方便理解算法,但性能往往会比较差。

比如多线程并行程序往往会比单线程串行的更高效,当然前提是并行的优化要大于创建多线程资源的开销。

  • 维度转换,空间与时间,量纲转换

高纬度可以降低低纬度上无法解决的问题,比如变换矩阵的齐次坐标,四元数解决万向解锁的问题等。

维度转换,如空间维度与时间维度的转换,面向对象设计的 ALS 到面向数据设计的 SOA 的转换,积分变换等。其中以空间换时间是大多数算法优化最直接的方式,如通过缓存池避免每次分配带来的开销。TAA 和 DLSS 都是通过时间维度上的卷积来实现优化的。

例如,将一张 2K 大小的图弄成 4 帧 1K 大小的图,通过时间维度参与计算,上一帧处理过的像素,在下一帧可能没有变化,这样就不用重新计算。