
Silent是一位小有名氣的游戲MOD作者,同時也是專攻逆向工程的游戲開發(fā)者。他平日里最大的樂趣便是為那些舊世代的經(jīng)典游戲制作各種MOD和修復(fù)補(bǔ)丁,這一過程中,自然也包括幫助玩家們解決各類稀奇古怪的BUG。
比如最近,Silent就收到了一份令他頗感費(fèi)解的BUG報告——有位使用了他制作的原版《GTA:圣安地列斯》修復(fù)補(bǔ)丁的玩家反映,在系統(tǒng)更新至Windows11 24H2版本后,游戲內(nèi)的水上飛機(jī)Skimmer離奇消失。

早在去年Windows11推出了24H2版本過后,Silent時不時就會收到水上飛機(jī)消失的BUG報告。
他原本以為可能是自己的修復(fù)補(bǔ)丁與新的系統(tǒng)版本無法兼容,但在邀請了其他玩家測試過后,他發(fā)現(xiàn)未安裝任何MOD的純凈版游戲在更新到了24H2版本后也可能遇到同樣的問題。
為了驗證類似的問題是否會在自己的電腦上復(fù)現(xiàn),Silent搭建了Windows11 24H2 虛擬機(jī),并使用腳本生成了水上飛機(jī)Skimmer。結(jié)果在他執(zhí)行完命令的瞬間,主角CJ突然原地起飛至10.3千萬億米的高度,游戲畫面直接卡死。

經(jīng)過一番排查,Silent發(fā)現(xiàn)問題的根源在于水上飛機(jī)Skimmer模型的邊界框Z軸坐標(biāo)被設(shè)定為了一個極其不正常的數(shù)字,而這個錯誤源于游戲配置文件缺少了定義輪子尺寸的參數(shù),導(dǎo)致在初始化懸掛系統(tǒng)時,錯誤地更新了Z軸的上限。

至于為何會出現(xiàn)這樣的問題,Silent認(rèn)為可能是在前作《俠盜獵車手:罪惡都市》里并不存在“飛機(jī)”這一類別,Skimmer是游戲中唯二能被玩家操控的飛機(jī),因此在設(shè)計上并沒有定義這些值。
到了《圣安地列斯》中,Skimmer的載具類型被改為飛機(jī) ,但開發(fā)人員卻忘記了添加額外的參數(shù)。
在舊版操作系統(tǒng)中,內(nèi)存堆棧的分配和管理方式與新版系統(tǒng)不同。游戲代碼在處理完一輛載具的輪子尺寸后,存儲這些尺寸的棧內(nèi)存并沒有被立即覆蓋。簡單來說就是,水上飛機(jī)的數(shù)據(jù)缺少輪子尺寸信息,代碼錯誤地沿用了上一輛載具的輪子尺寸,意外地讓Skimmer得以勉強(qiáng)正常運(yùn)行。
Windows 11 24H2 更新改變了內(nèi)存堆棧使用方式,使用了更多的??臻g,從而覆蓋了殘留值,最終導(dǎo)致Skimmer的Z軸數(shù)值出錯,并由此引發(fā)了后續(xù)的一系列 BUG。

當(dāng)然,水上飛機(jī)消失的BUG與Windows 11的24H2版本更新無關(guān),因為WinAPI 函數(shù)使用堆棧的方式之類的內(nèi)容不受約束,隨時可能修改。真正的問題在于游戲代碼本身存在編寫失誤,以及官方對游戲后續(xù)更新的支持力度不足。
借此機(jī)會,Silent還檢查了《GTA:圣安地列斯》其他版本的二進(jìn)制文件。他發(fā)現(xiàn),早在最初的Xbox版中,官方其實就已經(jīng)修復(fù)了這個BUG,并且這一修復(fù)沿用到了后來發(fā)布的Android、Xbox 360、PS3乃至最終版等多個版本。

不過,在2005年發(fā)售的PC原版當(dāng)中,官方始終沒有推送修復(fù)補(bǔ)丁解決這一問題,這個BUG便也潛伏了近20年之久。
如果換做是別的游戲,這類離奇的BUG或許永遠(yuǎn)不會得到解決,并就此成為玩家們口口相傳的都市傳說。值得慶幸的是,哪怕是20年前的GTA,時至今日仍有大批MOD作者在盡力優(yōu)化游戲體驗,排查各種潛在的BUG。
這個案例對于那些喜歡鉆研老游戲的玩家們來說,也算是又提了個醒:升級Windows系統(tǒng),還是謹(jǐn)慎為妙。
熱門跟貼