二十多年後的今天,玩家們仍在不斷發掘傳奇射擊遊戲《戰慄時空2》令人著迷的新細節。前Valve設計師湯姆·福賽斯近日披露,2013年曾發現一個足以導致《戰慄時空2》遊戲崩潰的漏洞——這個漏洞如同穿越時空,感染了2004年發布的原始版本。

根據福賽斯在Mastodon平台的詳細敘述,當時他與Valve程式員喬·路德維希正致力於將《戰慄時空2》移植到Oculus Rift VR設備。在遊戲開局階段,福賽斯遭遇了一個匪夷所思的漏洞:某扇門無法開啟,徹底阻斷了主線進程。更蹊蹺的是,從未有人記得在原版遊戲中遇到過這個漏洞。福賽斯甚至調閱了相同場景的實機錄影,確認原版根本不存在這個問題。
“糟了,這絕對無法發布。”福賽斯寫道,“我召集了包括原版開發成員在內的同事驗證,結果確認遊戲確實存在故障。更詭異的是,就算退出VR模式漏洞依然存在——說明這不是我們移植造成的。但所有相關程式碼都未曾改動過。”Valve團隊隨後深挖程式碼庫,用2004年原始程式碼重新編譯遊戲,驚人地發現這個漏洞竟真的存在於最初版本中。這個2013年首次發現的漏洞,仿佛穿越時空汙染了九年前的遊戲檔案。

當時最緊迫的任務是在Oculus Rift版發布前完成修復,但更令人毛骨悚然的是這個漏洞的時空穿越特性。福賽斯描述道:“所有人都震驚了——這絕非普通漏洞,它就像逆流時間長河感染了原始版本!”
開發團隊最終鎖定症結:守衛站立位置過於貼近門扉,當門扇開啟時,守衛的腳趾與門板發生碰撞,導致門扇彈回閉合狀態。雖然修復工作“耗費大量精力重啟偵錯工具”,但解決方案本身其實“很簡單”。真正的謎團在於:為何這個漏洞在九年間從未發作?為何2004年時守衛的腳趾不曾阻礙開門?
“我們反複驗證原始程式碼,確認守衛的腳趾始終處於妨礙位置。這個漏洞一直存在,為何當年門能正常開啟?”福賽斯發出靈魂拷問。

謎底最終浮出水面:一切源於“經典浮點數精度問題”。福賽斯解釋道:《戰慄時空2》原版發行時SSE指令集尚未普及,多數程式碼採用x87浮點運算指令集。這種架構精度參差不齊(32/64/80位混合),而十年後SSE指令集已成為x86CPU標準,其32/64位精度嚴格按程式碼要求執行。
正是這種精度差異導致了關鍵區別:在原始x87架構中,守衛靴底與地面的摩擦力恰好使其在碰撞時旋轉足夠角度容門通過;而SSE架構下“大量微精度差異”導致守衛旋轉角度略微不足。“在下一幀運算時,他的腳趾仍阻礙門徑。遊戲物理引擎不允許穿模,門扇只能以完全彈性碰撞反彈閉合——你就此陷入死局。”
這意味著,漏洞其實始終潛伏在遊戲中。由於原始編譯器默認使用舊式浮點精度,遊戲物理運算會產生細微差異,正是這毫厘之差,決定了那扇關鍵門扉能否開啟。
“這就是最終答案。”福賽斯總結道,“遊戲開發兩大bug溫床——門系統與浮點精度——共同將簡單的NPC站位問題,演變成這場穿越時空的技術謎案。”
來源:遊俠網