当前位置:首页>java>有哪些令人拍案叫绝的代码/优化?

有哪些令人拍案叫绝的代码/优化?

  • 2026-10-21 13:27:39
有哪些令人拍案叫绝的代码/优化?
那不得不提这一串数字。
0x5f3759df。
反正我第一次看到这个故事的时候,确实是被惊呆了,这也太妙了。
《雷神之锤3》是一个经典的 FPS 游戏,这个游戏画面十分精美,而且优化得特别好,在配置很差的电脑上也能够流畅运行。
我们都知道,其实 3D 引擎的核心还是数学运算。
光照在物体表面怎么反射,取决于物体表面的角度,为了计算这个角度,计算机需要频繁地对一个向量进行归一化处理。
这里面必须要做的一步运算,就是求平方根倒数。
你可能觉得这有什么难的,调用系统函数算呗,(float)(1.0/sqrt(x))就行了。
后来雷神之锤 3 的源码开放了。
人们发现了这个函数。它长得非常诡异,甚至带着一种邪气。
代码里先是把输入的浮点数强行变成长整型,然后出现了一行让全世界程序员盯着看了十分钟都没看懂的语句。
这行代码里有一个十六进制的数字:0x5f3759df。
旁边还有一句注释,What the fuck,这特么是啥?
就是我标红的那一句,就算我不标红,你也能一眼看到后面那个。
然而,就是这段代码,它的效率比系统函数要快上 4 倍。
大概解释一下。
那我们要搞清楚计算机是怎么存储数字的。存储整数很简单,直接转成二进制就行了;
如果是存储小数,使用的是一种叫做 IEEE 754 的标准,有点像科学记数法,一部分存储指数,另一部分存储有效数字。
然后写这段代码的大神发现:
浮点数的二进制位模式和它的对数之间存在一种奇妙的线性关系。
简单来说,如果你把一个浮点数的二进制码直接当成整数来看,它竟然近似于这个浮点数对数的一半。
所以他直接把代表浮点数的内存数据提取出来,当成整数处理,利用位运算向右移一位,在二进制中,右移一位就是除以 2。
回到数学上,求平方根的倒数,其实就是求这个数的 -1/2 次方,取对数后就变成了乘以 -0.5。
所以用一步右移的操作,在数学层面完成了除以二的计算,就避开了比较费劲的浮点运算。
但是移位之后数据会发生偏移,需要把它拽回来。这个拽回来的锚点就是0x5f3759df。
经过这一步整数减法和移位,计算机其实是猜出了一个结果。
你没听错,是猜。
这个结果肯定是不精确的,大概只有几位的精度,接下来,代码用了一次 牛顿迭代法,你可以理解为这个猜出来的数字很粗糙,但是经过了一步打磨,它的精度就变得很高了。
后来一个数学家(普渡大学的数学家Chris Lomont)对这个数字也很感兴趣,用理论上推导出了一个更完美的常数0x5f37642f,跟我们上文提到的0x5f3759df 十分接近。
然后,数学家用它推导出的数,跟我们上文提到的这个数做效率测试,没有人家雷神之锤 3 里边的那个数快,
这位数学家并不甘心,后来又使用类似于穷举的方法,找到了一个更优秀的数0x5f375a86。兴高采烈的写了一篇论文,平方根倒数速算法。
对了,至今没人知道这个数是怎么来的,也不知道是谁写的。
所以才会有那么一句 what the fuck 的注释。

最新文章

随机文章