我总是发现“微观优化”这个术语比较模棱两可。如果对内存布局和访问模式的某些指令级更改使专业人员在不降低算法复杂性的情况下测量热点的速度提高了80倍,这是否是“微优化”?对我来说,这是一种“超级优化”,可以使实际用例的速度提高80倍。人们倾向于谈论这些事情,例如这种优化具有微观效果。
我不再在gamedev中工作,但在VFX中工作,例如路径跟踪,而且我已经看到许多BVH和KD树的实现,它们在复杂场景中每秒处理约50万条光线(多线程评估)。粗略地说,即使使用多线程评估,我也倾向于在光线跟踪环境中以低于100万条光线/秒的速度直接实现BVH。除Embree的BVH可以使用相同硬件在同一场景上处理超过1亿条射线外。
这完全归因于Embree的“微优化”速度提高了200倍(相同的算法和数据结构),但之所以如此之快,是因为其背后的Intel开发人员都是专业人士,他们依靠自己的分析器和测量工具以及真正调整了重要的领域。他们并没有凭直觉改变代码,而是做出了使0.000000001%的改进以显着降低可维护性为代价的更改。这些都是明智地运用到的非常精确的优化-在焦点方面可能是微观的,在效果方面是宏观的。
自然地,根据游戏对实时帧速率的要求,取决于您使用游戏引擎的高低级别(即使使用UE 4制作的游戏也经常至少部分以高级脚本实现,但不是说物理引擎的最关键部分),微优化在某些领域已成为实际需求。
每天围绕着我们的另一个非常基本的领域是图像处理,例如实时模糊高分辨率图像,以及作为过渡的一部分,可能对它们进行其他处理,我们可能已经在某处看到了过渡,甚至可能是操作系统的影响。您不必从头开始遍历图像的所有像素就可以实现此类图像操作,而不必以匹配的帧速率获得这种实时结果。如果是CPU,我们通常是在看SIMD和一些微调,或者是在看GPU着色器,这往往需要一种微层次的思维方式才能有效地编写。
如果可以,随着硬件的改进,我们是否应该期望高级语言接管游戏产业?
我相当怀疑仅凭硬件的进步就能做到这一点,因为随着硬件的进步,指令和技术(例如:GPU上的物理原理),技术以及客户对他们希望看到的产品和竞争的期望也同样如此。经常使开发人员再次进入低级状态的方式,例如现在Web开发人员在WebGL中编写低级GLSL着色器的情况(这种特定类型的Web开发可以说比十年或两年前更低,因为GLSL是一种极为底层的C语言,而且我从未想过十年或两年前,某些Web开发人员会接受编写此类底层GPU着色器)。
如果要有一种将性能至关重要的领域转移到高级语言的方法,那么它将必须更多地来自于我所看到的软件,编译器和工具。在任何可预见的将来,对我而言,问题都不在于硬件功能不够强大。它与我们如何在每次变化和前进时都无法找到最有效地与之交谈的方式有关,而又没有重新回到自己的语言的方式。正如我所看到的,实际上是硬件的快速变化使高级编程在这些领域变得难以捉摸,因为如果假设我们的硬件在接下来的几十年里不再突飞猛进,
有趣的是,这些天,当我在真正的性能至关重要的领域工作时,我不得不比起我开始时要低一些(即使我是在Borland Turbo C DOS时代开始的)。因为那时CPU缓存几乎不存在。它主要只是DRAM和寄存器,这意味着我可以将更多精力放在算法复杂性上,并以非常直接的方式编写链接结构(例如树),而不会影响性能。这些天,CPU缓存的低级细节几乎与算法本身一样主宰了我的思维。同样,我们拥有多核计算机,必须让我们考虑多线程,原子和互斥体以及线程安全性和并发数据结构等,在很多方面,我认为这是一个较低层次的关注点(如而不是像人类刚开始时那样直观)。
奇怪的是,现在对我来说这很真实。我认为,与30年前相比,今天我对硬件的底层和底层复杂性以及细节的影响更大,我正竭尽所能摘下怀旧眼镜。当然,我们可能在这里讨论了一些组装问题,并且不得不处理一些复杂的细节,例如XMS / EMS。但是在大多数情况下,我会说当时需要的复杂性,硬件和编译器意识要比今天在关键性能领域工作时要少。如果我们撇开写作不谈,这对整个行业来说几乎都是正确的。if/else
以更易于理解的方式进行声明,并考虑目前有多少人在思考硬件的底层细节(从多核到GPU到SIMD到CPU缓存,以及它们的编译器/解释器/库工作等等)。
高级别!=效率较低
回到这个问题:
如果可以,随着硬件的改进,我们是否应该期望高级语言接管游戏产业?
对我来说,这与硬件无关。这是关于优化器和工具的。当我开始时,人们几乎都是用汇编语言编写所有的主机游戏,并且当时确实具有性能上的优势,尤其是在缺乏生成6502的高质量编译器的情况下。
随着优化的C编译器在优化过程中变得越来越聪明,然后他们开始达到用C编写的高级代码与之抗衡的地步,有时甚至在许多领域甚至胜过了最优秀的汇编专家编写的代码(尽管并非总是如此),并且因此,至少在游戏的大部分编码中采用C无疑是一件容易的事。C ++在某个时候逐渐发生了类似的变化。C ++的采用速度较慢,因为我认为从汇编到C的生产力提升可能会完全由完全用ASM编写非平凡游戏的游戏开发者达成一致的共识,而不是从C转向C ++。
但是这些转变并不是来自硬件变得如此强大,而是因为这些语言的优化器在很大程度上降低了底层语言的水平(尽管并非总是如此,有些情况并不明显)已经过时了。
如果您可以想象一个假设的场景,我们可以用可以想象的最高级别的代码编写代码,而不用担心多线程或GPU或缓存未命中之类的问题(甚至可能不是特定的数据结构),并且优化器就像人工智能聪明,可以找出最有效的内存布局来重新排列和压缩我们的数据,找出它可以在此处和那里使用一些GPU,在此处和那里并行使用一些代码,使用一些SIMD,也许自己配置一下,并像人类一样继续优化其IR确实对探查器热点做出了响应,并且以超过全球最优秀专家的方式做到了这一点,那么即使是那些对性能至关重要的领域的工作人员也可以毫不费力地采用它...这是一个进步来自可笑的智能优化器,而不是更快的硬件。