性能优化问题的本质
慢与快的问题
前提
稳定性:不能因优化造成稳定性变差;
兼容性:不能因优化导致兼容性变差;
性价比:优化要有度,考虑成本与复杂度。
性能优化的流程
发现问题(什么平台、什么操作系统、什么情况下出现问题,一般问题还是特例问题等)
定位问题(什么地方造成的性能问题,我们要用什么工具、什么方法确定瓶颈)
研究问题(确定用什么方案处理这个问题,要考虑性能优化的前提)
解决问题(按问题研究的结论去实际处理,并验证处理结果与预期的一致性)
影响性能的四大类问题
CPU
GPU
带宽
内存
隐藏的几类小问题
功耗比
填充率(实际渲染中,纹理或资源很大,带宽一次传不过去,两次又浪费的情况,这时你需要修改你的资源大小来匹配带宽,避免填充率不足或带宽阻塞问题)
发热量
性能问题可能得情况
经验总结
瓶颈可能性按由高到低的顺序排列
CPU 利用率
带宽利用率
CPU/GPU强制同步
片元着色器指令
几何图形到 CPU 到 GPU 的传输
纹理 CPU 到 GPU 的传输
顶点着色器指令
几何图形复杂性
GPU 端的瓶颈往往是片元着色器的问题,这点瓶颈很好确认,只需要改变显示分辨率,即可快速确认是不是由于片元着色器带来的问题。
经常用的优化思路
升维与降维
升维用来优化性能,但从算法方面来说可能不太容易理解。
降维是为了方便理解算法,但性能往往会比较差。
比如多线程并行程序往往会比单线程串行的更高效,当然前提是并行的优化要大于创建多线程资源的开销。
维度转换,空间与时间,量纲转换
高纬度可以降低低纬度上无法解决的问题,比如变换矩阵的齐次坐标,四元数解决万向解锁的问题等。
维度转换,如空间维度与时间维度的转换,面向对象设计的 ALS 到面向数据设计的 SOA 的转换,积分变换等。其中以空间换时间是大多数算法优化最直接的方式,如通过缓存池避免每次分配带来的开销。TAA 和 DLSS 都是通过时间维度上的卷积来实现优化的。
例如,将一张 2K 大小的图弄成 4 帧 1K 大小的图,通过时间维度参与计算,上一帧处理过的像素,在下一帧可能没有变化,这样就不用重新计算。