介绍优化中用到的概念
优化流程
- 建立Benchmark
- 进行检测
- 解决问题
- 检查优化效果
- 重复以上工作
瓶颈和热点
瓶颈
例如GPU和CPU中寻找性能瓶颈
热点
例如逻辑热点等
Trade-Off
时间和空间
精度和速度
开发效率和性能
优化维度
优化的三个维度:
系统、应用、底层微观结构
在平衡计算机每个模块的时候考虑3个因素:利用率、平衡、效率
系统层面(System Level)
- 利用率:如果硬件利用率不做,硬件会进入idle
- 平衡:如果GPU变得越来越厉害,之前CPU剔除三角面片的做法可能还是让GPU去判断可见性更为高效
- 效率:电脑的每一部分擅长的地方不一样,GPU可以快速处理并行任务,而CPU则不行
我们的目标是,让我们的系统完全平衡、完全利用,并且足够高效
算法层面(Algorithmic Level)
有大量调用的函数,可以通过算法层面的优化去进行性能调优。
用工具输出函数调用树,帮助调优。
算法层面的优化是至关重要的
微观层面(Micro Level)
分析指令时序以及管线状态,利用复杂的硬件特性来获取微小的性能优化。
编译器的微观优化非常厉害,可以自动进行大量的微观优化。
在进行shader处理的时候就直接进行微观优化了,因为shader每一帧都进行大量执行。
微观优化在固定平台上比较可控,但是在PC游戏则需要小心,因为很多特性只能在最新的硬件上才能生效。
优化陷阱
假设
很多时候我们利用先前的经验来假设。但是实际上我们应该使用测量和分析的方法去做。打个彼方,GPU和硬件假设你会使用大数据进行提交。DX API假设你不会将一个静态顶点缓冲锁住多于一次。
过早优化
虽然这么说,但是还是有百分之三的情况我们需要关注小的效率,关键是如何找到这百分之三的问题,所以检测是非常重要的。
只在一台机器上优化
大部分人工作只在一到两台机器上。低端机器的性能比平均的机器的性能问题更大,你需要确定在最差系统上面的性能。在尽可能多的机器上测试,特别是差的机器。
优化Debug模式
这个问题很容易避免。不用多说。
差劲的Benchmark
错误的benchmark让你误以为你的游戏跑的更快。打个比方第一次测试用了全屏,第二次测试用的窗口模式,那么结果必然有所出入。
并发
主机时代很早就使用了多芯片并行处理
而PC则晚一些,但是现在并行处理是趋势
SIMD
SIMT
可以无感知下进行并行
多线程是最主要的优化手段,但是需要对系统架构进行大修改。
中间件
你无法修改中间件的代码
大O记号
在算法中确实有效果,但是在实际应用中还是需要根据实际情况来处理。
例如$O(n^2)$的算法会比$O(nlogn)$更快,因为cache或者prefetch的效果。