优化

Video Game Optimization——优化基础

介绍优化中用到的概念

优化流程

  • 建立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的效果。

总结

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注