今天小編分享的遊戲經驗:Win11的更新,給20年前的GTA帶來了新BUG,歡迎閱讀。
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 系統,還是謹慎為妙。
>