[閒聊] 老遊戲的變態程式碼

看板C_Chat (希洽)作者 (戦艦棲姫)時間5小時前 (2025/07/22 16:45), 編輯推噓34(34034)
留言68則, 39人參與, 53分鐘前最新討論串1/3 (看更多)
https://www.youtube.com/watch?v=n2Q1Sp7iew4
https://en.wikipedia.org/wiki/Fast_inverse_square_root 1999年製作的一款遊戲:Quake III Arena 在遊戲開發者之間,這款遊戲的程式碼成為了熱門話題 因為下面這個求1/√x的程式碼實在太變態了而讓大家頗為驚訝 float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed return y; } 影片中有解說這個程式碼在幹什麼 簡單來說就是用好計算的加減乘除來取代複雜的求平方根的過程 因為現代電腦計算速度夠快,直接叫電腦求平方根也可以 但這款遊戲是1999年出的,求平方根這件事情是為了計算光影的強度 因為會影響到光影的計算速度,就算有一點誤差也希望可以大幅提速 畢竟就算有誤差,1%的明亮度差異應該大多數的人不會在意,所以速度比較重要 具體做了什麼可以參考影片內容 這個程式碼似乎是由某位數學教授想出來的 然後這個遊戲的製作人把數學教授的想法拿來活用的結果 各位有看過這種變態程式碼嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.64.25.104 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1753173942.A.9A6.html

07/22 16:47, 5小時前 , 1F
雷神之鎚3算很有名的案例了吧
07/22 16:47, 1F

07/22 16:48, 5小時前 , 2F
主要是0x5f3759df這個魔術數字是怎麼出現的
07/22 16:48, 2F

07/22 16:48, 5小時前 , 3F
雷神之槌3的magic number
07/22 16:48, 3F

07/22 16:49, 5小時前 , 4F
聽說是牛頓法算出來的
07/22 16:49, 4F

07/22 16:49, 5小時前 , 5F
卡馬克自己都不記得怎麼寫出來的 什麼時候變成數學教授了
07/22 16:49, 5F

07/22 16:49, 5小時前 , 6F
文組看不懂 誰能解釋的白話一點QQ
07/22 16:49, 6F

07/22 16:51, 5小時前 , 7F
用一句話把一件事講了個大概準確 在容量只有一行時 很神
07/22 16:51, 7F

07/22 16:51, 5小時前 , 8F
這很有名啊 看注釋在WTF 就在嘴能用卻不能理解原理
07/22 16:51, 8F

07/22 16:51, 5小時前 , 9F
這種東西都稱為魔術數字,把計算合在一起的結果,對於
07/22 16:51, 9F

07/22 16:51, 5小時前 , 10F
低效能的電腦很有用,但沒任何註解就沒人知道怎麼來的
07/22 16:51, 10F

07/22 16:53, 5小時前 , 11F
以前都要考慮有限的效能能做多少事情,現在都直接靠硬體
07/22 16:53, 11F

07/22 16:53, 5小時前 , 12F
效能直接車過去,跑不動的請自己換頂級硬體
07/22 16:53, 12F

07/22 16:53, 5小時前 , 13F
性能有限的時候拿來快速跑出近似解而不是最佳解
07/22 16:53, 13F

07/22 16:54, 5小時前 , 14F
卡馬克最近在開發AI的樣子
07/22 16:54, 14F

07/22 16:54, 5小時前 , 15F
// what the fuck? 我有時候也會寫出這種註解w
07/22 16:54, 15F

07/22 16:55, 5小時前 , 16F
好像用到找平方根的牛頓-拉森佛方法
07/22 16:55, 16F

07/22 16:55, 5小時前 , 17F
這個案例好像蠻有名的,幾年前就看過有人講
07/22 16:55, 17F

07/22 16:56, 5小時前 , 18F
註釋應該是接手的人寫的吧,不然真就窮舉法了= =
07/22 16:56, 18F

07/22 16:56, 5小時前 , 19F
20年來都有人在講 不過算了 現在不弄短影音就沒人看過似的
07/22 16:56, 19F

07/22 16:59, 5小時前 , 20F
數學不好要怎麼寫程式?
07/22 16:59, 20F

07/22 17:00, 5小時前 , 21F
粗略來說就計算光線之類需要平方根倒數 老實算很慢
07/22 17:00, 21F

07/22 17:00, 5小時前 , 22F
這個就減少計算浮點能用整數就好 快得多取得近似值
07/22 17:00, 22F

07/22 17:03, 5小時前 , 23F
FIS啊 別問 用就是了
07/22 17:03, 23F

07/22 17:04, 5小時前 , 24F
這段的關鍵是WTF這段註解
07/22 17:04, 24F

07/22 17:05, 5小時前 , 25F
那0x5f3759df也不是唯一能用 WiKi上有中文條目可看
07/22 17:05, 25F

07/22 17:12, 5小時前 , 26F
插值法吧 記得這個數字不是最佳解但也很接近了
07/22 17:12, 26F

07/22 17:12, 5小時前 , 27F
卡馬克也不是發明者,據說是從古早黑客論壇流出的
07/22 17:12, 27F

07/22 17:16, 5小時前 , 28F
以前是用數學來幫助程式 例如1 + 到100 可以用for迴圈慢
07/22 17:16, 28F

07/22 17:16, 5小時前 , 29F
慢sum 但用梯形公式更快 現在就是反過來用大量運算來模
07/22 17:16, 29F

07/22 17:16, 5小時前 , 30F
擬某個行為後再分析結果 已經變成用程式來幫助數學了
07/22 17:16, 30F

07/22 17:17, 5小時前 , 31F
就是快速平方根倒數阿 那個常數比較神奇 數學論文只給出
07/22 17:17, 31F

07/22 17:17, 5小時前 , 32F
某個範圍的數當初值比較好 這個常數是最好的值
07/22 17:17, 32F

07/22 17:18, 5小時前 , 33F
有人就推測作者是直接窮舉 用程式跑完那個範圍的數 找出最
07/22 17:18, 33F

07/22 17:18, 5小時前 , 34F
好的那個值
07/22 17:18, 34F

07/22 17:21, 5小時前 , 35F
這老熟了
07/22 17:21, 35F

07/22 17:40, 4小時前 , 36F
// what the fuck
07/22 17:40, 36F

07/22 17:40, 4小時前 , 37F

07/22 17:41, 4小時前 , 38F
這個議題有人有做中文解說影片
07/22 17:41, 38F

07/22 17:41, 4小時前 , 39F
問就是wtf
07/22 17:41, 39F

07/22 17:42, 4小時前 , 40F
卡瑪克有說不是自己發明的,只知道是當時負責雷神之錘項
07/22 17:42, 40F

07/22 17:42, 4小時前 , 41F
目的一個碼農
07/22 17:42, 41F

07/22 17:42, 4小時前 , 42F
以前資結聽過介紹好像是用計算尺之類的去填表格 找出那個
07/22 17:42, 42F

07/22 17:42, 4小時前 , 43F
16制值
07/22 17:42, 43F

07/22 17:45, 4小時前 , 44F
以前程式就是有很多創意的解,現在大概就直接問AI就完事
07/22 17:45, 44F

07/22 17:47, 4小時前 , 45F
最快的算法永遠是公式解 O(1)
07/22 17:47, 45F

07/22 17:48, 4小時前 , 46F
以前硬體性能不好激發各種創意
07/22 17:48, 46F

07/22 17:48, 4小時前 , 47F
比那個年代更早之前靠人力計算做出SR71和登月軌道
07/22 17:48, 47F

07/22 17:53, 4小時前 , 48F
老程式很常有這種magic number
07/22 17:53, 48F

07/22 17:54, 4小時前 , 49F
It just works
07/22 17:54, 49F

07/22 17:59, 4小時前 , 50F
很多影片都說明過這個數值
07/22 17:59, 50F

07/22 18:01, 4小時前 , 51F
SR71最神奇的是他那顆引擎的
07/22 18:01, 51F

07/22 18:05, 4小時前 , 52F
遊戲偏前端 所以可以規劃遊戲的時候就先算好然後套數字
07/22 18:05, 52F

07/22 18:05, 4小時前 , 53F
進去來節省計算資源
07/22 18:05, 53F

07/22 18:18, 4小時前 , 54F
那不是最佳解 只是誤差程度很變態
07/22 18:18, 54F

07/22 18:19, 4小時前 , 55F
實際上用起來效率跟最佳解沒有多少差別 不用的話則是
07/22 18:19, 55F

07/22 18:19, 4小時前 , 56F
爆慢
07/22 18:19, 56F

07/22 18:21, 4小時前 , 57F
這種功能程式把數字寫死是合理的 當然要直接寫死
07/22 18:21, 57F

07/22 18:21, 4小時前 , 58F
變態的是你為什麼知道那個數字
07/22 18:21, 58F

07/22 18:27, 4小時前 , 59F
程式寫多一點都會遇到 大概是跑數值分析出來的值直接
07/22 18:27, 59F

07/22 18:27, 4小時前 , 60F
套用
07/22 18:27, 60F

07/22 18:30, 3小時前 , 61F
太神啦
07/22 18:30, 61F

07/22 18:31, 3小時前 , 62F
最神奇是裡面沒有除法
07/22 18:31, 62F

07/22 18:33, 3小時前 , 63F
Old school電腦時代的藝術
07/22 18:33, 63F

07/22 18:42, 3小時前 , 64F
就牛頓法+浮點數表示法
07/22 18:42, 64F

07/22 18:42, 3小時前 , 65F
不就近似嗎,很直觀就會想到的啊
07/22 18:42, 65F

07/22 19:51, 2小時前 , 66F
不是單純的近似 那個值怎麼找很有門道路
07/22 19:51, 66F

07/22 20:01, 2小時前 , 67F
這個快速算法的精髓就在於那個起始值的挑選
07/22 20:01, 67F

07/22 21:36, 53分鐘前 , 68F
太神奇了
07/22 21:36, 68F
文章代碼(AID): #1eVq-scc (C_Chat)
文章代碼(AID): #1eVq-scc (C_Chat)