Silent是一位小有名氣的游戲MOD作者,同時也是專攻逆向工程的游戲開發者。他平日里最大的樂趣便是為那些舊世代的經典游戲制作各種MOD和修復補丁,這一過程中,自然也包括幫助玩家們解決各類稀奇古怪的BUG。
比如最近,Silent就收到了一份令他頗感費解的BUG報告——有位使用了他制作的原版《GTA:圣安地列斯》修復補丁的玩家反映,在系統更新至Windows11 24H2版本后,游戲內的水上飛機Skimmer離奇消失。
早在去年Windows11推出了24H2版本過后,Silent時不時就會收到水上飛機消失的BUG報告。
他原本以為可能是自己的修復補丁與新的系統版本無法兼容,但在邀請了其他玩家測試過后,他發現未安裝任何MOD的純凈版游戲在更新到了24H2版本后也可能遇到同樣的問題。
為了驗證類似的問題是否會在自己的電腦上復現,Silent搭建了Windows11 24H2 虛擬機,并使用腳本生成了水上飛機Skimmer。結果在他執行完命令的瞬間,主角CJ突然原地起飛至10.3千萬億米的高度,游戲畫面直接卡死。
經過一番排查,Silent發現問題的根源在于水上飛機Skimmer模型的邊界框Z軸坐標被設定為了一個極其不正常的數字,而這個錯誤源于游戲配置文件缺少了定義輪子尺寸的參數,導致在初始化懸掛系統時,錯誤地更新了Z軸的上限。
至于為何會出現這樣的問題,Silent認為可能是在前作《俠盜獵車手:罪惡都市》里并不存在“飛機”這一類別,Skimmer是游戲中唯二能被玩家操控的飛機,因此在設計上并沒有定義這些值。
到了《圣安地列斯》中,Skimmer的載具類型被改為飛機 ,但開發人員卻忘記了添加額外的參數。
在舊版操作系統中,內存堆棧的分配和管理方式與新版系統不同。游戲代碼在處理完一輛載具的輪子尺寸后,存儲這些尺寸的棧內存并沒有被立即覆蓋。簡單來說就是,水上飛機的數據缺少輪子尺寸信息,代碼錯誤地沿用了上一輛載具的輪子尺寸,意外地讓Skimmer得以勉強正常運行。
Windows 11 24H2 更新改變了內存堆棧使用方式,使用了更多的棧空間,從而覆蓋了殘留值,最終導致Skimmer的Z軸數值出錯,并由此引發了后續的一系列 BUG。
當然,水上飛機消失的BUG與Windows 11的24H2版本更新無關,因為WinAPI 函數使用堆棧的方式之類的內容不受約束,隨時可能修改。真正的問題在于游戲代碼本身存在編寫失誤,以及官方對游戲后續更新的支持力度不足。
借此機會,Silent還檢查了《GTA:圣安地列斯》其他版本的二進制文件。他發現,早在最初的Xbox版中,官方其實就已經修復了這個BUG,并且這一修復沿用到了后來發布的Android、Xbox 360、PS3乃至最終版等多個版本。
不過,在2005年發售的PC原版當中,官方始終沒有推送修復補丁解決這一問題,這個BUG便也潛伏了近20年之久。
如果換做是別的游戲,這類離奇的BUG或許永遠不會得到解決,并就此成為玩家們口口相傳的都市傳說。值得慶幸的是,哪怕是20年前的GTA,時至今日仍有大批MOD作者在盡力優化游戲體驗,排查各種潛在的BUG。
這個案例對于那些喜歡鉆研老游戲的玩家們來說,也算是又提了個醒:升級Windows系統,還是謹慎為妙。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.