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 頁面上的原因。
相關文章
五大出版社悄悄用AI做封面,讀者已經開始認出來了
《連線》報導稱,美國五大出版社中至少三家在未揭露的情況下用AI生成封面與文案。官方回應與員工說法相互矛盾,而名字印在封面上的作者,往往是最後一個知道的人。
Character.AI 聲請破產,迪士尼用 2000 萬美元替專利托底
Character.AI 聲請破產,迪士尼以 2000 萬美元充當馬前卒,買的只是部分資產和專利授權。一個 1.5 億美元 A 輪的故事,最後落在專利和每月八九百萬美元的虧損上。
XERJ:一個會坦承自己數字灌水的程式代理搜尋引擎
XERJ 用本地索引和 tree-sitter 符號讓程式代理少讀檔案。實測比 grep 省 2.7 倍 token,而不是標題宣稱的 40 倍,維護者自己把這件事講了出來。
別再讓 AI 盯著螢幕點滑鼠了:CLI-Anything 替每個軟體配一條命令列
別教 agent 看螢幕點滑鼠。CLI-Anything 用七階段管線替 GIMP、Blender、LibreOffice 生成附測試與文件的 CLI,讓 agent 直接敲命令。