从前,当 > 比 < 更快的时候……等等,什么?(这是一个关于IT技术的玩笑,没有实际意义)

284

我正在阅读一份很棒的OpenGL教程。相信我,它真的很好。我目前在学习Z-buffer。除了解释这是什么之外,作者还提到我们可以执行自定义深度测试,例如GL_LESS,GL_ALWAYS等。他还解释说深度值的实际含义(哪个是顶部,哪个不是)也可以自定义。到目前为止,我理解了。然后作者说了一些令人难以置信的话:

zNear的范围可以大于zFar的范围;如果是这样,那么窗口空间值将被反转,就是最靠近或最远离观察者的内容。

早先,我们说过窗口空间Z值为0时最接近,1时最远离。然而,如果我们的裁剪空间Z值被取反,深度为1的将变成最接近视图的部分,深度为0的将变成最远离视图的部分。但是,如果我们翻转深度测试的方向(从GL_LESS到GL_GREATER等),我们将得到完全相同的结果。所以这只是一个惯例。事实上,翻转Z的符号和深度测试曾经是许多游戏的重要性能优化方法。

如果我理解正确,就性能而言,翻转Z的符号和深度测试无非就是将一个 < 比较变成了一个 > 比较。所以,如果我理解正确并且作者没有说谎或捏造事实,那么将 < 改为 > 曾经是很多游戏中的重要优化

作者是在撒谎,还是我有什么误解,或者确实曾经情况如此,<> 慢(像作者所说的那样)?

感谢您澄清这个非常好奇的问题!

免责声明:我完全意识到算法复杂度是优化的主要来源。此外,我怀疑现在它绝对不会有任何区别,我并不是为了优化任何东西而提出这个问题。我只是非常、痛苦地、也许是过分好奇。


(a < b)与(b > a)完全相同,因此没有必要在硬件中实现两个比较操作。性能差异是由比较操作的结果引起的。这是一条漫长而曲折的道路,需要解释所有副作用,但以下是一些指针。游戏用于填充深度缓冲区,以避免对未通过深度测试的片段进行更昂贵的片段处理。Quake将深度范围分成两半,以避免清除帧缓冲区,因为游戏始终填充屏幕上的每个像素等等。 - t0rakka
这是所引用的OpenGL教程的存档版本。但我似乎找不到引用的片段,可能已经被删除了。 - Fons
3个回答

353
如果我理解正确,在性能方面,翻转Z的符号和深度测试只是将<比较更改为>比较。所以,如果我理解正确,作者没有撒谎或编造事实,那么将<更改为>曾经是许多游戏的重要优化。
我没有特别清楚地解释这一点,因为这并不重要。我只觉得这是一个有趣的小知识点。我并不打算具体介绍算法。
然而,上下文是关键。我从未说过<比较比>比较更快。请记住:我们正在讨论图形硬件深度测试,而不是CPU。不是operator<
我所指的是一种特定的旧优化,其中一个帧你会使用GL_LESS和[0,0.5]范围。下一帧,您使用范围为[1.0,0.5]的GL_GREATER进行渲染。你来回切换,每帧都会“翻转Z的符号和深度测试”。
这会失去一位深度精度,但您不必清除深度缓冲区,因为在过去的某个时候这是一个相当慢的操作。由于现在深度清除不仅是免费的,而且比这种技术更快,人们现在不再使用它了。

2
现在清除深度缓冲区更快的原因有两个,都基于GPU使用分层深度缓冲区的事实。因此,只需清除设置瓷砖状态以进行清除(这很快),但是更改深度比较符号意味着需要刷新整个HiZ缓冲区,因为它仅存储最小值或最大值,具体取决于比较符号。 - Jasper Bekkers
3
@NicolBolas:PerTZHX的评论中,我在问题中提供的教程链接已经失效了。您能否告诉我们教程现在移动到哪里,并可选地编辑一下问题呢? - Armen Tsirunyan
2
教程可以在Web存档中找到。如果@NicolBolas允许,如果我们能将它们移动到更易访问的位置,对社区会很有帮助。也许是GitHub或其他什么地方。http://web.archive.org/web/20150215073105/http://arcsynthesis.org/gltut/ - ApoorvaJ

3
答案几乎肯定是,无论使用的芯片+驱动程序的哪种化身,分层Z缓冲只能在一个方向上工作 - 这是当时相当普遍的问题。低级汇编/分支与此无关 - Z缓冲在固定功能硬件中完成,并且是流水线处理的 - 没有猜测,因此也没有分支预测。

-9

这与高度优化的汇编程序中的标志位有关。

x86具有jl和jg指令,但大多数RISC处理器只有jl和jz(没有jg)。


2
如果这是答案,那就会引发新的问题。早期的RISC处理器中,“分支被采取”比“分支被忽略”慢吗?据我所知,现在无论如何都不是这样了。你是否应该使用无条件向后跳转和有条件、很少执行的向前跳转来退出循环编写for循环呢?听起来很别扭。 - Pascal Cuoq
56
这个问题与CPU没有任何关系。GL_LESS和GL_GREATER是深度比较操作,运行在GPU上。 - Nicol Bolas
9
有趣的是,你可以因为回答标题正确但与实际问题关系甚少的答案而获得很高的声望。 - Joshua
8
+1 不,这个回答至少对问题的一部分是正确的。问题是:“作者是在编造事实,我是否理解有误,还是确实存在‘<’比‘>’慢(正如作者所说)的情况?” 给出了三个选项。这个回答是针对第三个选项的可能性做出的回应。在文章中没有提到CPU/GPU的技术细节,也没有说必须使用GPU(最早的3D游戏是在CPU上运行的)。好吧...我认为在RISC上没有多少3D游戏 :-) - xanatos
4
(并且GPU标签是在20:34添加的。第一次修订只有CPU标签。这个回答是在18:44写的) - xanatos
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接