← 返回部落格
Ai預計閱讀 10 分鐘

AnyPS5:不模擬主機,直接把 PS5 執行檔重新連結

發布於 2026年10月18日
AnyPS5:不模擬主機,直接把 PS5 執行檔重新連結

有一種專案會在 GitHub 上莫名其妙地紅起來,卻沒人說得清原因。AnyPS5 就是其中之一。它掛在週榜第一,新增大約 16,000 顆星,提交數接近 10,000,而它那句一句話簡介——「把 PS5 執行檔自動移植到 Linux 和 Windows 的工具」——正是那種會讓律師伸手拿筆、讓工程師伸手按書籤的句子。

有意思的不是它存在,而是它拒絕變成什麼。

沒有模擬器,沒有執行環境,沒有視窗裡的主機

大多數在 PC 上跑主機軟體的專案都是模擬器。它們替硬體建模:CPU、GPU、記憶體配置、時序。這條路走通了是奇蹟,走不通就是長達十年的苦工,因為每一款遊戲都變成了一場談判——對手是一台沒人拿到完整文件的機器的不完整模型。

AnyPS5 走的是另一條路。它提供的是一個 relinker,把 PS5 執行檔轉換成目標平台的原生格式,另外還實作了該執行檔預期要連結的系統 prx 函式庫。README 把後果講得很白:沒有模擬,也沒有獨立的執行環境行程。遊戲的程式碼以原生碼的形式跑在你的機器上,呼叫的是被重新實作的系統函式庫,就像它原本呼叫索尼的函式庫一樣。

這個承諾要兌現難得多,但一旦兌現,回報也大得多。模擬是對每一道指令課稅。重新連結只對邊界課稅——只對那幾處從遊戲跨進系統層的呼叫課稅。

決定成敗的那一塊:著色器

遊戲基本上就是一群披著遊戲外衣的著色器。一款 PS5 作品帶的是為特定繪圖堆疊編譯好的 GPU 程式,而 Windows 或 Linux 機器要的是驅動能吞得下的東西。AnyPS5 裡有個著色器重編譯器,輸出 SPIR-V;儲存庫裡註明,當建置啟用 ANYPS5_ENABLE_SPIRV_TOOLS 時,會用 SPIRV-Tools 驗證輸出。

驗證 SPIR-V 和把遊戲跑起來不是同一回事。它只說明產生的模組在結構上合法,而這正是「也許跑得動」和「驅動會直接退件,而且難除錯到讓人崩潰」之間的差別。任何盯著一片黑畫面熬過一整晚的人,都懂這道檢查值多少。

專案自己的進度頁對數字的意義很小心。函式庫覆蓋率算的是「專案到目前為止已經宣告過的函式」裡的比例,不是 PS5 所暴露全部函式的比例。這種說法很誠實,也意味著當專案一點一點發現自己還不知道多少東西時,這個百分比還會繼續變動。

它是怎麼失敗的——而且是故意這樣設計

有一個設計決定很能說明這套程式碼庫的成熟度。遇到不支援或意料之外的狀態,它會丟出 std::runtime_error;訊息送到 stderr,行程直接結束。

聽起來很粗暴,但這是對的。另一種做法——猜一下、繼續跑、把狀態弄髒——會在三個影格之後、在一個跟真正 bug 毫無關係的地方掛掉。處在這個階段的專案,需要的是響亮、提早、具體的失敗。十月中有一筆提交,修的就是這類順序問題造成的 Windows 測試卡住:在 Windows 上,從 main 返回的測試會走 exit,而 exit 會在 DLL detach 時、靜態解構函式執行之前把其他執行緒全部終結;此時若有解構函式還在等一個已經死掉的 logger,它就永遠不會返回。修法是在 MinGW 上把 main 包一層,改成透過 libc 終止行程。這工作不體面,但正是這種工作把 demo 和工具分開。

輸入,還有那些不起眼卻要命的小事

經 SDL 對應的手把可以用,包含類比搖桿和扳機。鍵盤滑鼠透過 anyps5-input.ini 設定。另外有個網頁轉換器,檔案在本機處理,什麼都不會上傳。

逐遊戲的相容性並沒有維護在 README 裡。它放在一張用公開 GitHub 資料搭起來的社群 blocker map 上,每個標題在儲存庫的 discussions 裡都有對應的測試回報討論串。下載之前值得先搞懂這件事:這個專案追蹤的是每一款遊戲卡在哪裡,不是一份「能跑」的綠色清單。

那段你真正該讀的法律聲明

免責聲明說,本專案用於互通性、研究、保存與相容性。它聲明不包含、不散布、也不要求受著作權保護的軟體、韌體、金鑰或專有函式庫。它還說明,使用者有責任確保自己使用的任何二進位檔是合法取得、合法使用。

這條線畫得很小心,而它就是全部的關鍵。工具本身是 GPL-2.0-only,不含任何遊戲資料。你餵給它什麼,是你自己的事;而且在大多數司法管轄區,「我自己重新連結的」並不是一條在法庭上驗證過的抗辯。

邊界究竟在哪裡

relinker 的工作是符號解析。執行檔按名字要函式,工具得確保每一個名字在載入時都能解析到某個可呼叫的東西,呼叫慣例要對,而且是在一台並非該二進位檔原本建置目標的機器上。漏掉一個,行程就在啟動時死掉,通常只給你一則訊息,裡面寫著某個函式庫名稱,其他什麼都沒有。

所以專案那張覆蓋率頁面才是儲存庫裡最誠實的文件。它報告的是專案已宣告函式中有多少比例被實作——不是 PS5 全部 API 表面的比例。兩者差距巨大,也意味著當團隊發現自己不懂的東西更多時,這個百分比會往下掉。大多數專案會把這種動態藏起來。這個專案在數字旁邊加了一行註記。

GPU 那邊是同一套邏輯。著色器轉譯不是一個問題,而是每個著色器各是一個問題;一款遊戲可能正常渲染二十分鐘,然後撞上一條沒轉譯到的指令路徑,掛掉的樣子看起來像驅動 bug。SPIR-V 驗證這一步能提早抓住結構性問題。它抓不住語意問題,而專案也沒有聲稱能抓。

所以真正的問題不是「它能不能用」,而是「我這款遊戲停在哪裡」,blocker map 逐遊戲回答這個問題,還掛著對應的 issue。

為什麼是現在紅起來

保存這件事正當紅。光碟腐蝕、商店下架、伺服器關機——讓軟體繼續能跑的理由已經不再感性,而是很實際。relinker 某種意義上是保存工具,模擬器不是:它不需要替一台機器建模,只需要滿足軟體所期待的那個介面。

也有更簡單的解釋。這個專案體量驚人,提交成百上千地進來,其中相當一部分明顯是在編碼 agent 參與下寫成的——儲存庫裡甚至有個 AGENTS.md,列出 agent 容易違反的規則。看著一個 10,000 筆提交的專案在大概兩個半月內被堆出來,本身就是一場奇觀,也解釋了那條跟「能開幾款遊戲」關係不大的星數曲線。

那它到底該怎麼用

如果你手上有一個合法取得的執行檔,又剛好有個空閒的晚上,誠實的預期是:你會學到很多關於現代主機遊戲是怎麼拼起來的知識,而且你大概破不了關。先查你這款的 blocker map,開 issue 之前先讀技術債文件,發布任何用它建置的東西之前先讀授權條款。

不管最後有多少款遊戲開得起來,更大的那一點都成立。二十年來,「這套主機軟體能不能在別的地方跑」的答案一直是「除非有人把機器模擬出來」。AnyPS5 是第二個答案的一次認真嘗試;而它是公開寫出來的,用這個速度,帶著這麼多不體面的管線活——這正是它該出現在 trending 頁面上的原因。

相關文章